Экранирование строки Ruby для дополнительных символов Unicode плоскости

Я знаю, что могу избежать базового символа Unicode в Ruby с помощью \uNNNN escape-последовательность Например, для улыбающегося лица U + 263A (☺) я могу использовать строковый литерал "\u2603",

Как мне избежать символов Юникода больше U + FFFF, которые выходят за пределы основной многоязычной плоскости, как подмигивающее лицо: U + 1F609 (😉)?

Использование формы суррогатной пары, как в Java, не работает; в результате получается недопустимая строка, содержащая отдельные суррогатные кодовые точки:

s = "\uD83D\uDE09" # => "\xED\xA0\xBD\xED\xB8\x89"
s.valid_encoding? # => false

1 ответ

Решение

Вы можете использовать escape-последовательность \u{XXXXXX}, где XXXXXX от 1 до 6 шестнадцатеричных цифр:

s = "\u{1F609}" # => ""

Фигурные скобки также могут содержать несколько прогонов, разделенных пробелами или символами табуляции для кодирования нескольких символов:

s = "\u{41f 440 438 432 435 442 2c 20 43c 438 440}!" # => "Привет, мир!"

Вы также можете использовать побег из байтов, чтобы написать литерал, содержащий кодировку UTF-8 символа, хотя это не очень удобно и не обязательно приводит к строке в кодировке UTF-8, если кодировка файла отличается:

# encoding: utf-8
s = "\xF0\x9F\x98\x89" # => ""
s.length # => 1

# encoding: iso-8859-1
s = "\xF0\x9F\x98\x89" # => "\xF0\x9F\x98\x89"
s.length # => 4
Другие вопросы по тегам