Das funktioniert, aber nur mit ASCII. Wenn Sie Unicode-Zeichen außerhalb des ASCCI-Bereichs verwenden, werden Sie Probleme haben (da jedes Zeichen in ein Byte eingefügt wird, anstelle eines vollständigen Wortes, das von UTF-8 erlaubt wird). Sie können die folgende Typumwandlung durchführen, weil Sie wissen, dass das UTF-8 kein Byte überläuft, wenn Sie garantieren, dass die Eingabe im Grunde ASCII ist (wie Sie in Ihren Kommentaren erwähnen).
%Vor%Hier ist eine andere Lösung, die das Problem behebt, nur mit ASCII-Zeichen zu arbeiten. Dies funktioniert mit allen Unicode-Zeichen im UTF-8-Bereich anstelle von ASCII nur in den ersten 8 Bits des Bereichs. Danke an dezeze für die Fragen. Sie haben mich dazu gebracht, mehr über das Problem und die Lösung nachzudenken.
%Vor% Erstens, versuchen Sie gerade, ein Zeichenfolgenliteral zu analysieren, oder wird tmp
einige vom Benutzer eingegebene Daten sein?
Wenn dies ein String-Literal (d. h. eine hartcodierte Zeichenkette) sein soll, kann es unter Verwendung von Unicode-Escapes codiert werden. In Ihrem Fall bedeutet dies nur einzelne Backslashes statt doppelter Backslashes:
%Vor%Wenn Sie jedoch die String-Parsing-Regeln von Java zum Parsen von Benutzereingaben verwenden müssen, könnte Apache Commons Lang ein guter Ausgangspunkt sein. StringEscapeUtils.unescapeJava () Methode.
Ich bin mir sicher, dass muss ein besserer Weg sein muss, aber nur mit dem JDK:
%Vor% verwendet java.util.Properties.load(java.io.Reader)
um Backslash-Escapes zu verarbeiten (nach der ersten Verwendung von java.util.Properties.store(java.io.OutputStream, java.lang.String)
, Backslash-Escape alles, was Probleme in einer properties-Datei verursachen würde, und dann replace("\\", "\")
verwenden, um die Backslash-Escaping der ursprünglichen Backslashes umzukehren ).
(Disclaimer: Obwohl ich alle Fälle getestet habe, an die ich denken konnte, gibt es wahrscheinlich noch einige, an die ich nicht gedacht habe.)