oparty na specyfikacji, oto niektóre kod w Javie, który został przetestowany i działa:
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();
}
Ważne jest to, że musisz dodać 2 znaki (blisko znaku Unicode lub po prostu użyć? Zamiast) po kodowanym Esode. ponieważ kod Unicode zajmuje 2 bajty.
Również specyfikacja mówi, że powinieneś użyć wartości ujemnej, jeśli kod jest większy niż 32767, ale w moim teście jest to w porządku, jeśli nie używasz wartości ujemnej.
Oto specyfikacja:
\ un Ten parametr reprezentuje pojedynczy znak Unicode, który nie ma odpowiednika reprezentacji ANSI na podstawie bieżącej strony kodowej ANSI. N oznacza wartość znaku Unicode wyrażoną jako liczba dziesiętna. Po tym słowie kluczowym następuje odpowiednik znaku (ów) w reprezentacji ANSI. W ten sposób stare czytniki zignorują słowo kluczowe \ uN i prawidłowo podniosą reprezentację ANSI. Po napotkaniu tego słowa kluczowego czytelnik powinien zignorować następne N znaków, gdzie N odpowiada ostatniej napotkanej wartości \ ucN.
Podobnie jak w przypadku wszystkich słów kluczowych w formacie RTF, może istnieć przestrzeń kończąca słowa kluczowego (przed znakami ANSI), która nie jest wliczana w znaki do pominięcia. Chociaż nie jest to prawdopodobne (lub zalecane), słowo kluczowe \ bin, jego argument i następujące dane binarne są uważane za jeden znak dla celów pomijania. Jeśli napotkany zostanie znacznik ogranicznika zakresu RTF (to jest nawias otwierający lub zamykający) podczas skanowania możliwych do pominięcia danych, dane możliwe do pominięcia są uważane za zakończone przed ogranicznikiem. Dzięki temu czytelnik może wykonać podstawowe odzyskiwanie po błędzie. Aby dołączyć ogranicznik RTF do danych możliwych do pominięcia, musi on być reprezentowany przy użyciu odpowiedniego symbolu kontrolnego (to jest, z odwróconym ukośnikiem odwrotnym), jak w postaci zwykłego tekstu. Każde słowo lub symbol kontrolny RTF jest traktowany jako pojedynczy znak do celów liczenia możliwych do pominięcia znaków.
Pisarz RTF, napotykając znak Unicode bez odpowiadającego mu znaku ANSI, powinien wypisać \ uN, a następnie najlepszą reprezentację ANSI, którą może zarządzać. Ponadto, jeśli znak Unicode tłumaczy się na strumień znaków ANSI z liczbą bajtów różniącą się od bieżącej liczby bajtów znaków Unicode, powinien wyemitować słowo kluczowe \ uCN przed słowem kluczowym \ uN, aby powiadomić czytelnika o zmianie.
Słowa sterujące RTF ogólnie akceptują podpisane 16-bitowe liczby jako argumenty. Z tego powodu wartości Unicode większe niż 32767 muszą być wyrażone jako liczba ujemna
hmmmm, bardzo interesujący punkt.Jeśli to prawda, to prawdopodobnie gdzieś w mojej logice jest błąd ... odpowiedź Iana Kempa ma o wiele więcej sensu ... będę googlować – Emir
Dziękuję, na przykład, działa! – Emir