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

时间:2015-09-03 21:08:42

标签: ruby string unicode unicode-escapes supplementary

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

如何摆脱超出basic multilingual plane范围之外的U + FFFF的Unicode字符,就像眨眼的脸:U+1F609(?)?

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

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

1 个答案:

答案 0 :(得分:1)

您可以使用转义序列 \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编码string,如果文件编码不同:

# 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