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

标签 ruby string unicode unicode-escapes supplementary

我知道我可以使用 \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/

相关文章:

Ruby:如何为数组和哈希制作 IRB 打印结构

c - 面临编写我自己的和 my_itoa 以及我的 atoi 的挑战,它们应该在 C 中将整数更改为 ascii,反之亦然

objective-c - 两个字符串的比较失败

python - TypeError : initial_value must be unicode or None, 不是 str,

ruby-on-rails - Ruby on Rails - 不使用资源路由的路径变量

Ruby Net::SSH 未定义方法 'shell'

ruby-on-rails - erb是什么意思?

c++ - 如何将0x0000之类的字符串转换为int

c++ - 运行存储在 `std::wstring` 中的控制台命令

javascript - 替换 unicode 字符