Кодирование UTF-8 в RTF

dimagolov

Новичок
Кодирование UTF-8 в RTF

Символы в UTF-8 нужно кодировать в RTF в таком виде:
Код:
\ud{1,}  
       ^^
       ||
2 пробела после кода
То есть код символа в десятичном виде после префикса \u и два пробела после кода. Похоже на кодирование в json_encode, но нужно десятичное представление.

Как проще всего организовать подобное? Понятно, что можно побить посимвольно, потом паковать, получать в переменную код и отображать его. Или можно iconv приспособить?
 

Вурдалак

Продвинутый новичок
Типа этого можно:
PHP:
function encode($s) {
    $s = iconv('UTF-8', 'UCS-4LE', $s);
    $r = '';
    foreach(str_split($s, 4) as $chr) {
        $arr = unpack('Vcode', $chr);
        $r .= '\\u' . $arr['code'] . '  ';
    }

    return $r;
}
-~{}~ 20.08.10 22:55:

P.S. Здесь бы как раз синтаксис
PHP:
$r .= '\\u' . unpack('Vcode', $chr)['code'] . '  ';
пригодился бы.
 

dimagolov

Новичок
спасибо. немного добавил - нет нужды, верне в ряде случаев просто вредно, кодировать ASCII символы. в итоге вышло вот что:
PHP:
function encode_utf8($s) {
		$is_str= is_string($s);
		if ($is_str && ltrim($s, "\x00..\x7f") === '' || !$is_str && (is_scalar($s) || is_null($s)))
			return $s;
		$s= iconv('UTF-8', 'UCS-4LE', $s);
		$r= '';
		foreach(str_split($s, 4) as $chr) {
			$arr= unpack('Vcode', $chr);
			if ($arr['code'] < 128)
				$r.= chr($arr['code']);
			else
				$r.= '\\u'.$arr['code'].'  ';
		}

		return $r;
	}
 

dimagolov

Новичок
вообще-то нужно, но у меня сейчас этот код вызвается перед непосредственной записью в файл, то есть там и управляющие последовательности и текст и слешить что-либо уже поздно.

слешить слеши и фигурные скобки нужно в самом начале, когда получаем текст, который нужно вставлять. потому что потом может потребоваться форматирование того, что вставляем, то есть уже вставлять управляющие последовательности, которые слешить не надо.
 
Сверху