我知道我可以使用 \uNNNN
转义序列转义 Ruby 中的基本 Unicode 字符。例如,对于笑脸 U+263A (☺) 我可以使用字符串文字 "\u2603"
。
如何转义大于 U+FFFF 且落在 basic multilingual plane 之外的 Unicode 字符,就像一张眨眼的脸:U+1F609 (😉)?
像在 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
关于补充平面 Unicode 字符的 Ruby 字符串转义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32385451/