2015-10-29 28 views
17

Od ?Quotes:Jaka jest różnica między kodami szesnastkowymi ( x) i unicode ( u)?

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

W przypadku gdy znak Unicode ma tylko jedną lub dwie cyfry, spodziewam te znaki mają być takie same. W rzeczywistości, jeden z przykładów na stronie ?Quotes pomocy pokazuje:

"\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!" 

Jednak pod Linuksem, gdy próbuje wydrukować znak funta, widzę

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

Oznacza to, że kod \x sześciokątną nie wyświetla się poprawnie. (To zachowanie występowało w każdym locale, które próbowałem.) W Windows 7 obie wersje pokazują znak funta.

Jeśli skonwertuję na liczbę całkowitą i wstecz, wówczas znak funta wyświetla się poprawnie pod Linuksem.

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

Nawiasem mówiąc, to nie działa w systemie Windows, ponieważ utf8ToInt("\xa3") zwrotów NA.

Niektóre znaki \x zwracają NA w systemie Windows, ale wyświetlają błąd w systemie Linux. Na przykład:

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

("\uf0" to ważny znak.)

Te przykłady pokazują, że istnieją pewne różnice pomiędzy \x i \u form znaków, które wydają się być OS-specyficzny, ale mogę” t zobacz jakąkolwiek logikę, w jaki sposób są zdefiniowane.

Jaka jest różnica między tymi dwoma postaciami?

+0

To C#, ale może pomóc, ponieważ jest to samo pytanie: http://stackoverflow.com/questions/32175482/what-is-the-difference-between-using -u-and-x-while-represent-character-lite – etienne

+0

@etienne Nie zdziwiłbym się, gdyby krótka była szczegółowa odpowiedź wiki od Richiego. –

+1

@DavidArenburg: nah, właśnie napisał to pytanie, więc musi być zaskoczony. :) –

Odpowiedz

17

sekwencja ucieczki \xNN wstawia surowego bajt NN na łańcuch, przy czym \uNN wstawia UTF-8 bajtów punkt kodowy Unicode NN w ciągu UTF-8:

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

Te dwa rodzaje ucieczki sekwencja ta może być mieszany w tym samym ciąg:

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

Dzieje się tak dlatego, że sekwencje również określić kodowaniełańcucha . \uNN sekwencja wyraźnie określa kodowanie całego napisu „UTF-8”, natomiast \xNN pozostawia go w domyślnym „nieznany” (. Aka native) kodowanie:

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

Staje się to istotne podczas drukowania struny, jak muszą zostać przekonwertowane na odpowiednie kodowanie wyjściowe (np. konsoli).Struny z określonym kodowaniem można przekształcić odpowiednio (patrz enc2native), ale te z „nieznanym” kodowania są po prostu wyjście jak jest:

  • W systemie Linux konsola jest prawdopodobnie spodziewa UTF-8 tekst, a jako 0xA3 nie jest prawidłową sekwencją UTF-8, daje " ".
  • W systemie Windows konsola prawdopodobnie oczekuje tekstu Windows-1252, a ponieważ 0xA3 jest poprawnym kodowaniem dla "£", właśnie to widzisz. (Kiedy łańcuch jest \uA3 konwersja z UTF-8 na Windows-1252 odbywa.)

Jeśli kodowanie jest ustawione wyraźnie, odpowiednia konwersja odbędzie się Linux:

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

Zrobione z Pythona 2.7 Unicode jAK Docs:

W kodzie źródłowym Pythona, literałów Unicode są zapisywane jako ciągi poprzedzona „u” lub „u” znaków: u'abcdefghijk”. Określony kod punktów można zapisać za pomocą sekwencji \ u escape, która jest podążana za czterema cyframi szesnastkowymi podającymi punkt kodowy. Sekwencja ucieczki \ U podobne, ale oczekuje 8 cyfr HEX, nie 4.

literałami Unicode może używać tych samych sekwencji wydostać, jak 8-bitowych łańcuchów oraz \ X, a \ x przyjmuje tylko dwie cyfry sześciokątne więc nie może wyrazić arbitralnego punktu kodowego. Ósemkowe ucieczek może dochodzić nawet do U + 01ff, która ósemkowy 777.

Mówiąc prościej (mam nadzieję):
\ 0NN - określa dwie cyfry ósemkowy sekwencji ucieczki Unicode „punkt kod”.
\ xnn - określa dwucyfrowy kod szesnastkowy "kodowany".
\ unnnn - określa czterocyfrowe szesnastkowe "kodowanie" kodu Unicode.
\ Unnnnnnnn - określa ośmiobajtowy kod szesnastkowy "kodowy".

Należy użyć pełnej liczby cyfr wypełnionych wiodącymi zerami.

Na przykład:

>>> 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 
Powiązane problemy