От ?Quotes
:
\ xnn с заданным шестнадцатеричным кодом (1 или 2 шестнадцатеричных разряда)
\ unnn Unicode-символ с заданным кодом (1--4 шестнадцатеричных цифр)
В случае, когда символ Юникода имеет только одну или две цифры, я ожидал бы, что эти символы будут одинаковыми. На самом деле, один из примеров на странице справки ?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
под Windows, но вызывают ошибку в Linux. Например:
utf8ToInt("\xf0")
## Error in utf8ToInt("\xf0") : invalid UTF-8 string
("\uf0"
является допустимым символом.)
Эти примеры показывают, что существуют некоторые различия между формами символов \x
и \u
, которые кажутся специфичными для ОС, но я не вижу никакой логики в том, как они определены.
В чем разница между этими двумя символьными формами?