Ruby 补充平面 Unicode 字符的字符串转义

Ruby string escape for supplementary plane Unicode characters

我知道我可以使用 \uNNNN 转义序列转义 Ruby 中的基本 Unicode 字符。例如,对于笑脸 U+263A (☺) 我可以使用字符串文字 "\u2603".

如何转义超出 basic multilingual plane, like a winking face: U+1F609 (😉) 的大于 U+FFFF 的 Unicode 字符?

使用 Java 中的代理对形式不起作用;它会导致包含各个代理项代码点的无效字符串:

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

您可以使用转义序列 \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