Основываясь на спецификации, вот некоторый код на java, который протестирован и работает:
public static String escape(String s){
if (s == null) return s;
int len = s.length();
StringBuilder sb = new StringBuilder(len);
for (int i = 0; i < len; i++){
char c = s.charAt(i);
if (c >= 0x20 && c < 0x80){
if (c == '\\' || c == '{' || c == '}'){
sb.append('\\');
}
sb.append(c);
}
else if (c < 0x20 || (c >= 0x80 && c <= 0xFF)){
sb.append("\'");
sb.append(Integer.toHexString(c));
}else{
sb.append("\\u");
sb.append((short)c);
sb.append("??");//two bytes ignored
}
}
return sb.toString();
}
Важно то, что вам нужно добавить 2 символа (рядом с символом Unicode или просто использовать?) После экранированного uncode. потому что юникод занимает 2 байта.
Также в спецификации указано, что вы должны использовать отрицательное значение, если кодовая точка больше 32767, но в моем тесте все нормально, если вы не используете отрицательное значение.
Вот спецификация:
\ uN Это ключевое слово представляет один символ Unicode, который не имеет эквивалентного представления ANSI на основе текущей кодовой страницы ANSI. N представляет собой значение символа Юникода, выраженное десятичным числом. За этим ключевым словом сразу следует эквивалентный символ (символы) в представлении ANSI. Таким образом, старые читатели будут игнорировать ключевое слово \ uN и правильно воспринимать представление ANSI. Когда встречается это ключевое слово, читатель должен игнорировать следующие N символов, где N соответствует последнему встреченному значению \ ucN.
Как и во всех ключевых словах RTF, может присутствовать пробел в конце ключевого слова (перед символами ANSI), который не учитывается в символах, которые нужно пропустить. Хотя это маловероятно (или рекомендуется), ключевое слово \ bin, его аргумент и следующие за ним двоичные данные считаются одним символом в целях пропуска. Если при сканировании данных с возможностью пропуска встречается символ разделителя области RTF (то есть открывающая или закрывающая фигурная скобка), данные с возможностью пропуска считаются завершенными до разделителя. Это позволяет читателю выполнить элементарное устранение ошибок. Чтобы включить разделитель RTF в данные с возможностью пропуска, он должен быть представлен с помощью соответствующего управляющего символа (т. Е. С экранированием обратной косой чертой), как в обычном тексте. Любое управляющее слово или символ RTF считается отдельным символом при подсчете пропускаемых символов.
Модуль записи RTF, когда он встречает символ Unicode без соответствующего символа ANSI, должен вывести \ uN, за которым следует наилучшее представление ANSI, которым он может управлять. Кроме того, если символ Unicode преобразуется в поток символов ANSI со счетчиком байтов, отличающимся от текущего счетчика байтов символа Unicode, он должен выдать ключевое слово \ ucN перед ключевым словом \ uN, чтобы уведомить читателя об изменении.
Управляющие слова RTF обычно принимают в качестве аргументов 16-разрядные числа со знаком. По этой причине значения Unicode больше 32767 должны быть выражены как отрицательные числа.
person
Yongtao Wang
schedule
11.07.2016