2015-10-29 24 views
17

Da ?Quotes:Qual è la differenza tra codice esadecimale ( x) e unicode ( u) caratteri?

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

Nel caso in cui il carattere Unicode ha solo una o due cifre, mi aspetterei questi personaggi per essere lo stesso. In effetti, uno degli esempi nella pagina ?Quotes aiuto mostra:

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

Tuttavia, sotto Linux, quando si tenta di stampare un cancelletto, vedo

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

Cioè, il codice \x esadecimale non riesce a visualizzare correttamente. (Questo comportamento persisteva con qualsiasi locale che ho provato.) Sotto Windows 7 entrambe le versioni mostrano un cancelletto.

Se si converte in numero intero e indietro, il segno di cancelletto viene visualizzato correttamente sotto Linux.

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

Per inciso, questo non funziona sotto Windows, dal momento che i rendimenti utf8ToInt("\xa3")NA.

Alcuni caratteri \x restituiscono NA in Windows ma generano un errore sotto Linux. Per esempio:

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

("\uf0" è un carattere valido.)

Questi esempi mostrano che ci sono alcune differenze tra \x e \u forme di personaggi, che sembrano essere specifici-OS, ma posso' Non vedo alcuna logica nel modo in cui sono definiti.

Quali sono le differenze tra queste due forme di carattere?

+0

Questo è C#, ma può aiutare in quanto è la stessa domanda: http://stackoverflow.com/questions/32175482/what-is-the-difference-between-using -u-e-x-while-represent-character-lite – etienne

+0

@etienne Non sarei sorpreso se una risposta wiki dettagliata da parte dello stesso Richie seguirà in breve. –

+1

@DavidArenburg: nah, ha appena twittato questa domanda, quindi deve essere perplesso. :) –

risposta

17

La sequenza di escape \xNN inserisce il byte greggio NN in una stringa, mentre \uNN inserisce l'UTF-8 byte per Unicode punto NN codice in una stringa UTF-8:

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

Questi due tipi di fuga sequenza non può essere miscelato nella stessa stringa:

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

Questo perché le sequenze di escape anche definire il codifica della stringa . Una sequenza \uNN imposta in modo esplicito la codifica di tutta la stringa "UTF-8", mentre \xNN lascia nel default "sconosciuto" (. Aka nativo) codifica:

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

Ciò diventa importante quando si stampano stringhe, come devono essere convertiti nella codifica di output appropriata (ad es. quella della tua console).Stringhe con una codifica definita possono essere convertiti in modo appropriato (vedi enc2native), ma quelli con una codifica "sconosciuto" sono semplicemente in uscita così come sono:

  • Su Linux, la console è probabilmente aspetta testo UTF-8, e come 0xA3 non è una sequenza UTF-8 valida, ti dà " ".
  • Su Windows, la tua console probabilmente si aspetta il testo Windows-1252, e come 0xA3 è la codifica corretta per "£", questo è ciò che vedi. (Quando la stringa è \uA3, una conversione da UTF-8 a Windows-1252 si svolge.)

Se la codifica è impostata in modo esplicito, la conversione appropriata si svolgerà il Linux:

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

Tratto da Python 2.7 Unicode cOME DOCS:

Nel codice sorgente Python, letterali Unicode sono scritti come stringhe prefissati con la 'u' o 'U' carattere: u'abcdefghijk'. Il codice specifico punti può essere scritto utilizzando la sequenza di escape \ u, che viene seguita da di quattro cifre esadecimali che indicano il punto di codice. La sequenza di escape \ U è simile, ma si attende 8 cifre esadecimali, non 4.

letterali Unicode possono anche utilizzare le stesse sequenze di escape da 8 bit stringhe, tra \ x, ma \ x bastano due cifre esadecimali quindi non è possibile che esprima un punto di codice arbitrario. fughe Octal può arrivare fino a U + 01FF, che è ottale 777.

In parole povere (spero):
\ 0NN - specifica una sequenza di due cifre ottale escape Unicode 'punto di codice'.
\ xnn - specifica un codice unicode esadecimale 'code point'.
\ unnnn - specifica un codice unicode esadecimale a quattro cifre "code point".
\ Unnnnnnnn - specifica un codice unicode esadecimale a otto byte 'code point'.

È necessario utilizzare il numero completo di cifre, riempito con gli 0 iniziali.

Ad esempio:

>>> 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