2016-05-13 7 views
1

ausgewertet? Ich wollte einen String mit einem Text \1.Warum wird " 1" in einem String mit drei Anführungszeichen zu einem Unicode-0x1-Codepunkt

Was ich tat, war (die reale Saite war länger, aber es ist nicht wichtig):

''' 
\1 
''' 

, die in einem String führte eine Unicode 0x1 Codepunkt enthält.

Ich denke, was ich den umgekehrten Schrägstrich wie dies gerade getan haben sollte, ist zu entkommen:

''' 
\\1 
''' 

Was ich nicht verstehe ist, warum Groovy hier keinen Fehler melden. Ich dachte Unicode Escapes sind supposed to look like \u1?

Statt einem Syntaxfehler ich eine Laufzeitausnahme bekam, als ich diesen String in ein XML-Element zu setzen versucht:

An invalid XML character (Unicode: 0x1) was found in the element content of the document. 

Antwort

2

Das \ (Backslash) Symbol ein escape symbol ist. Wenn Sie es wörtlich verwenden wollen, müssen Sie es selbst entkommen: \\.

Wenn Sie ein beliebiges Zeichen verlassen, wird das Zeichen als eine besondere Bedeutung interpretiert. Im Fall der \1 Sequenz passiert es einfach, dass dies als 0x01 Codepoint interpretiert werden kann.

Dies ist das gleiche in Java Strings.

Wenn Sie nicht Zeichen zu entkommen in Groovy haben, verwenden Sie slashy strings:

def x = /\1/ 
assert x == "\\1" 

die auch als mehrzeilige funktioniert:

def x =/
\1 
/
+0

Jetzt, wo Sie es darauf hingewiesen wurde mir klar, es ist die [Oktal Escape-Sequenz] (https://docs.oracle.com/javase/specs/jls/se8/html/jls-3.html#jls-3.10.6) - Ich könnte schwören, dass sie mit '\ 0' beginnen müssen aber anscheinend tun sie nicht –

+0

Re. slashy string - schöner Vorschlag, aber eigentlich will ich hier keine Interpolation –