Есть ли разница между \ x {..} и \ N {U + ..} - PullRequest
2 голосов
/ 27 июня 2019

Есть ли разница в использовании \x{..} или \N{U+..} в операторе печати?Для меня они похожи на 2 способа сделать то же самое.Так в чем же разница - если она есть?

1 Ответ

6 голосов
/ 27 июня 2019

"\x{...}" и "\N{U+...}" всегда выдают одну и ту же строку, что означает, что "\x{...}" eq "\N{U+...}" всегда будет истинным (для одного и того же числа).

Однако, начиная с 5.12, скаляр, созданный "\N{U+...}", гарантированно будет использовать UTF8=1 внутренний формат хранения [1] , в то время как скаляр, созданный "\x{...}", не подлежит никакой гарантии (и фактически использует формат UTF8=0, когда это возможно). Это означает, что utf8::upgrade не нужно вызывать в скаляре, производимом "\N{U+...}", перед передачей его функциям (встроенным или XS), которые страдают от ошибки Unicode. [2]

Короче говоря, "\N{U+...}" с большей вероятностью будет работать правильно при работе с кодовыми точками Unicode, а "\x{...}" с большей вероятностью будет работать правильно при работе с байтами.


  1. Формат хранения UTF8=0 поддерживает строки из 8-битных символов, в то время как формат хранения UTF8=1 поддерживает строки из 32- или 64-битных символов (в зависимости от сборки).

  2. Это относится к коду, который рассматривает две одинаковые строки как разные, потому что одна хранится в формате UTF8=0, а другая - в формате UTF8=1). Код, который назначает семантику для формата хранения, содержит ошибки, потому что Perl может и свободно конвертирует строки между двумя форматами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...