"\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{...}"
с большей вероятностью будет работать правильно при работе с байтами.
Формат хранения UTF8=0
поддерживает строки из 8-битных символов, в то время как формат хранения UTF8=1
поддерживает строки из 32- или 64-битных символов (в зависимости от сборки).
Это относится к коду, который рассматривает две одинаковые строки как разные, потому что одна хранится в формате UTF8=0
, а другая - в формате UTF8=1
). Код, который назначает семантику для формата хранения, содержит ошибки, потому что Perl может и свободно конвертирует строки между двумя форматами.