В чем разница между шестнадцатеричным кодом (\ x) и символами юникода (\ u)?
От?Quotes
:
\xnn character with given hex code (1 or 2 hex digits)
\unnnn Unicode character with given code (1--4 hex digits)
В случае, когда символ Unicode имеет только одну или две цифры, я ожидал бы, что эти символы будут одинаковыми. На самом деле, один из примеров на?Quotes
страница справки показывает:
"\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!"
Однако под Linux, когда я пытаюсь напечатать знак фунта, я вижу
cat("\ua3")
## £
cat("\xa3")
## �
Это\x
шестнадцатеричный код не отображается правильно. (Это поведение сохранялось для любой локали, которую я пробовал.) В Windows 7 обе версии показывают знак фунта.
Если я преобразую в целое число и обратно, тогда знак фунта будет отображаться правильно в Linux.
cat(intToUtf8(utf8ToInt("\xa3")))
## £
Кстати, это не работает под Windows, так какutf8ToInt("\xa3")
возвращаетсяNA
.
Немного\x
символы возвращаютсяNA
под виндой но выкинуть ошибку под линуксом. Например:
utf8ToInt("\xf0")
## Error in utf8ToInt("\xf0") : invalid UTF-8 string
("\uf0"
является действительным символом.)
Эти примеры показывают, что между\x
а также\u
формы символов, которые кажутся специфичными для ОС, но я не вижу никакой логики в том, как они определены.
В чем разница между этими двумя символами?