2015-10-29 8 views
17

Von ?Quotes:Was ist der Unterschied zwischen Hex-Code ( x) und Unicode ( u) Zeichen?

\xnn character with given hex code (1 or 2 hex digits) 
\unnnn Unicode character with given code (1--4 hex digits) 

In dem Fall, dass die Unicode-Zeichen nur ein oder zwei Ziffern haben, würde ich diese Charaktere erwartet, dass das gleiche sein. In der Tat, eines der Beispiele auf der ?Quotes Hilfeseite zeigt:

"\x48\x65\x6c\x6c\x6f\x20\x57\x6f\x72\x6c\x64\x21" 
## [1] "Hello World!" 
"\u48\u65\u6c\u6c\u6f\u20\u57\u6f\u72\u6c\u64\u21" 
## [1] "Hello World!" 

jedoch unter Linux, wenn ein Pfund-Zeichen zu drucken versuchen, ich sehe

cat("\ua3") 
## £ 
cat("\xa3") 
## � 

Das heißt, den \x Hex-Code wird nicht korrekt angezeigt. (Dieses Verhalten wurde bei allen Ländereinstellungen beibehalten, die ich ausprobiert habe.) Unter Windows 7 wird in beiden Versionen ein Nummernzeichen angezeigt.

Wenn ich in Integer und zurück umwandel, dann wird das Pfundzeichen korrekt unter Linux angezeigt.

cat(intToUtf8(utf8ToInt("\xa3"))) 
## £ 

übrigens diese unter Windows nicht funktioniert, da utf8ToInt("\xa3") kehrt NA.

Einige \x Zeichen geben NA unter Windows zurück, aber werfen einen Fehler unter Linux. Zum Beispiel:

utf8ToInt("\xf0") 
## Error in utf8ToInt("\xf0") : invalid UTF-8 string 

("\uf0" ist ein gültiges Zeichen.)

Diese Beispiele zeigen, dass es einige Unterschiede zwischen \x und \u Formen der Zeichen, die scheinen OS-spezifisch zu sein, aber ich kann‘ Ich sehe keine Logik in ihrer Definition.

Was sind die Unterschiede zwischen diesen beiden Zeichenformen?

+0

Das C# ist, aber es kann Ihnen helfen, da es die gleiche Frage: http://stackoverflow.com/questions/32175482/what-is-the-difference-between-using -u-and-x-while-representation-character-lite – etienne

+0

@etienne Ich wäre nicht überrascht, wenn eine ausführliche Wiki-Antwort von Richie selbst in Kürze folgen würde. –

+1

@DavidArenburg: Nein, er hat nur diese Frage getwittert, also muss er ratlos sein. :) –

Antwort

17

Die Escape-Sequenz \xNN das rohe Byte NN in eine Zeichenfolge einfügt, während \uNN der UTF-8 Bytes für den Unicode-Codepunkt NN in einen UTF-8-String Inserts:

> charToRaw('\xA3') 
[1] a3 
> charToRaw('\uA3') 
[1] c2 a3 

Diese beiden Arten von escape Sequenz kann nicht in dem gleichen String gemischt werden:

> '\ua3\xa3' 
Error: mixing Unicode and octal/hex escapes in a string is not allowed 

Dies, da die Escape-Sequenzen definieren auch die Codierung des Strings . Eine \uNN Sequenz explizit setzt die Kodierung der gesamten Zeichenfolge „UTF-8“, während \xNN es in dem Standard „unbekannt“ verläßt (. Aka nativ) Codierung:

> Encoding('\xa3') 
[1] "unknown" 
> Encoding('\ua3') 
[1] "UTF-8" 

Diese wichtig wird, wenn Strings Druck, wie Sie müssen in die entsprechende Ausgabekodierung (z. B. die Ihrer Konsole) konvertiert werden.Strings mit einer definierten Codierung kann in geeigneter Weise umgewandelt werden (siehe enc2native), aber solche mit einem „unbekannten“ encoding sind einfach ausgegeben, wie sie ist:

  • Unter Linux Konsole wahrscheinlich erwartet UTF-8-Text, und als 0xA3 ist keine gültige UTF-8-Sequenz, es gibt Ihnen " ".
  • Unter Windows erwartet Ihre Konsole wahrscheinlich Windows-1252-Text, und als 0xA3 ist die korrekte Codierung für "£", das ist, was Sie sehen. (Wenn die Zeichenfolge \uA3 ist, eine Konvertierung von UTF-8 auf Windows-1252 statt.)

Wenn die Codierung explizit festgelegt wird, wird die entsprechende Umwandlung findet am Linux:

> s <- '\xa3' 
> Encoding(s) <- 'latin1' 
> cat(s) 
£ 
-2

entnommen aus dem Python 2.7 Unicode HOW TO Dokumente der:

In Python Quellcode wird Unicode Literale als Zeichenfolge geschrieben Präfix mit dem 'U' oder 'U' Charakter: u'abcdefghijk‘. Spezifischer Code Punkte können mit der \ escapesequenz geschrieben werden, der von vier Hexadezimalziffern gefolgt wird, die den Codepunkt geben. Die \ U Escape-Sequenz ist ähnlich, aber erwartet 8 Hexadezimalziffern, nicht 4.

Unicode Literale auch die gleichen Escape-Sequenzen als 8-Bit Strings verwenden können, einschließlich \ x, aber \ x dauert nur zwei Hexadezimalziffern so kann es nicht einen beliebigen Codepunkt ausdrücken. Octal Fluchten können bis zu U + 01FF gehen, die Oktal ist 777.

Einfach gesagt (ich hoffe):
\ 0nn - gibt eine zweistellige oktale Escape-Sequenz Unicode 'Codepunkt'.
\ xnn - Gibt einen zweistelligen hexadezimalen Unicode-Codepunkt an.
\ unnnn - gibt einen vierstelligen hexadezimalen "Codepunkt" an.
\ Unnnnnnnn - gibt einen Acht-Byte-Hex-Unicode-Codepunkt an.

Die volle Anzahl der Ziffern muss verwendet werden, aufgefüllt mit führenden Nullen.

Zum Beispiel:

>>> ord(u'\010') 
8 
>>> ord(u'\x10') 
16 
>>> ord(u'\020') 
16 
>>> ord(u'\x20') 
32 
>>> ord(u'\u0020') 
32 
>>> ord(u'\U00000020') 
32 
>>> ord(u'\u1000') 
4096 
Verwandte Themen