Der richtige Weg, dies zu tun, ist eine Regex zu verwenden, um die gesamte Unicode-Definition zu entsprechen und Gruppenersatz zu verwenden.
Die Regex die Unicode-String zu:
Ein Unicode-Zeichen wie \uABCD
aussieht, so \u
, durch einen String mit 4 Zeichen HexNumber gefolgt. Passende diese können mit fertig
\\u[A-Fa-f\d]{4}
Aber es gibt ein Problem mit diesem:
In einem String
wie „nur einige \\ uabcd beliebigen Text“ die \u
würde noch angepasst bekommen. Also müssen wir sicherstellen, dass die \u
durch eine gerade Anzahl von \
s vorausgeht:
(?<!\\)(\\\\)*\\u[A-Fa-f\d]{4}
nun als Ausgang, wollen wir einen umgekehrten Schrägstrich durch den hexnum-Teil gefolgt. Dies kann durch die Gruppe-Ersatz durchgeführt werden, also lassen Sie sich durch die Gruppierung Zeichen beginnen zu erhalten:
(?<!\\)(\\\\)*(\\u)([A-Fa-f\d]{4})
Als Ersatz haben wir alle Rückschläge aus der Gruppe wollen die zwei Schrägstriche übereinstimmt, gefolgt von einem Backslash und dem hexnum-Teil der Unicode-wörtliche:
$1\\$3
Jetzt für den eigentlichen Code:
String pattern = "(?<!\\\\)(\\\\\\\\)*(\\\\u)([A-Fa-f\\d]{4})";
String replace = "$1\\\\$3";
Matcher match = Pattern.compile(pattern).matcher(test);
String result = match.replaceAll(replace);
das ist eine Menge von umgekehrten Schrägstrichen ist! Nun, es gibt ein Problem mit Java, Regex und Backslash: Backslashes müssen in Java und Regex maskiert werden. So entspricht "\\\\" als Musterzeichenfolge in Java einem als regulär abgeglichenen Zeichen.
EDIT:
Auf aktuellen Strings, müssen die Zeichen herausgefiltert werden und durch ihre ganze Zahl-Darstellung ersetzt werden:
StringBuilder sb = new StringBuilder();
for(char c : in.toCharArray())
if(c > 127)
sb.append("\\").append(String.format("%04x", (int) c));
else
sb.append(c);
Dies setzt voraus, durch „Unicode-Zeichen“ Sie bedeuten nicht-ASCII-Zeichen . Dieser Code wird ein beliebiges ASCII-Zeichen ausgeben und alle anderen Zeichen als Backslash gefolgt von ihrem Unicode-Code ausgeben. Die Definition "Unicode-Zeichen" ist jedoch ziemlich vage, da in Java immer Unicode-Zeichen stehen. Bei diesem Ansatz werden Kontrollzeichen wie "\ n", "\ r" usw. beibehalten, weshalb ich sie anderen Definitionen vorgezogen habe.
Mögliche Duplikate von [Java Regex - So ersetzen Sie ein Muster oder wie] (http://stackoverflow.com/questions/9285231/java-regex-how-to-replace-a-pattern-or-how- zu) – Paul
Frage in Verbindung Java Regex - Wie ein Muster oder wie zu ersetzen, ist dies anders als meine Frage beschäftigt sich mit Unicode-Zeichen. Obwohl es mehrere Literale hat, wird es von jvm als ein einzelnes Zeichen betrachtet und deshalb funktioniert Regex nicht. – Maz