Экранирование строки 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