Auf der Grundlage der Beschreibung sind einige Code in Java hier hinzugefügt, und arbeitet getestet:
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();
}
Wichtig ist, dass Sie 2 Zeichen (in der Nähe des Unicode-Zeichens oder einfach nur?) Nach dem Escape-Code einfügen müssen. weil die Unicode 2 Bytes belegen.
Auch die Spezifikation sagt, dass Sie negativen Wert verwenden sollten, wenn der Codepunkt größer als 32767 ist, aber in meinem Test ist es in Ordnung, wenn Sie keinen negativen Wert verwenden. Hier
ist die spec:
\ uN Dieses Schlüsselwort ein einzelnes Unicode-Zeichen darstellt, die keine Entsprechung ANSI Darstellung auf der aktuellen Seite ANSI Code basiert hat. N stellt den Unicode-Zeichenwert dar, der als Dezimalzahl ausgedrückt wird. Auf dieses Schlüsselwort folgen sofort äquivalente Zeichen in ANSI-Darstellung. Auf diese Weise ignorieren alte Leser das Schlüsselwort \ uN und nehmen die ANSI-Darstellung richtig auf. Wenn dieses Schlüsselwort gefunden wird, sollte der Leser die nächsten N Zeichen ignorieren, wobei N dem letzten gefundenen \ ucN-Wert entspricht.
Wie bei allen RTF-Schlüsselwörtern kann ein Schlüsselwortbeendigungsbereich vorhanden sein (vor den ANSI-Zeichen), der in den zu überspringenden Zeichen nicht berücksichtigt wird. Obwohl dies nicht wahrscheinlich ist (oder empfohlen wird), werden ein \ bin-Schlüsselwort, sein Argument und die folgenden Binärdaten als ein Zeichen zum Überspringen von Zwecken betrachtet. Wenn beim Scannen überspringbarer Daten ein RTF-Bereichsbegrenzungszeichen (also eine öffnende oder schließende geschweifte Klammer) angetroffen wird, werden die überspringbaren Daten als vor dem Begrenzungszeichen beendet betrachtet. Dies ermöglicht es einem Leser, eine rudimentäre Fehlerbehebung durchzuführen. Um ein RTF-Trennzeichen in überspringbare Daten einzufügen, muss es wie im Klartext mit dem entsprechenden Kontrollsymbol dargestellt werden (dh mit einem umgekehrten Schrägstrich versehen). Jedes RTF-Steuerwort oder -Symbol wird zum Zählen überspringbarer Zeichen als ein einzelnes Zeichen betrachtet.
Wenn ein RTF-Writer auf ein Unicode-Zeichen ohne entsprechendes ANSI-Zeichen stößt, sollte er \ uN gefolgt von der besten ANSI-Darstellung ausgeben, die er verwalten kann. Wenn das Unicode-Zeichen in einen ANSI-Zeichenstrom konvertiert wird, dessen Anzahl sich von der aktuellen Unicode-Zeichenbyteanzahl unterscheidet, sollte das Schlüsselwort \ ucN vor dem Schlüsselwort \ uN ausgegeben werden, um den Leser über die Änderung zu informieren.
RTF-Steuerwörter akzeptieren im Allgemeinen signierte 16-Bit-Zahlen als Argumente. Aus diesem Grund müssen Unicode-Werte größer als 32767 als negative Zahl ausgedrückt werden
hmmmm, sehr interessanter Punkt.Wenn das wahr ist, dann liegt wahrscheinlich irgendwo ein Fehler in meiner Logik ... und Ian Kemps Antwort macht viel mehr Sinn ... Ich werde weiter googlen – Emir
Danke zum Beispiel, es funktioniert! – Emir