Ruby尝试动态创建Unicode字符串时抛出“无效的Unicode转义”错误。

5

我有一个需求,需要使用内插法动态创建一个Unicode字符串。例如,请查看在irb中尝试的以下代码:

2.1.2 :016 > hex = 0x0905
 => 2309 
2.1.2 :017 > b = "\u#{hex}"
SyntaxError: (irb):17: invalid Unicode escape
b = "\u#{hex}"

十六进制代码0x0905对应于DEVANAGARI LETTER A的独立元音的Unicode编码。

我无法弄清如何实现所需的结果。


3
似乎您不知道如何格式化代码块,这对于一个长期使用者来说有点令人惊讶,请阅读帮助页面,不要再添加您的签名。 - Yu Hao
谢谢Yu Hao。以后会注意你提出的要点。 - Jignesh Gohel
2个回答

5
您可以将编码传递给 Integer#chr 方法:
hex = 0x0905
hex.chr('UTF-8') #=> "अ"

如果设置Encoding::default_internal为UTF-8,则可以省略该参数:

$ ruby -E UTF-8:UTF-8 -e "p 0x0905.chr"
"अ"

您也可以将代码点附加到其他字符串中:
'' << hex #=> "अ"

这个答案似乎比Uri Agassi的答案更简洁。然而,两种技术都可以很好地运作。感谢Uri和Stefan的贡献。 - Jignesh Gohel

1

字符串插值发生在 Ruby 解码转义之后,因此您尝试执行的操作会被 Ruby 解释为不完整的转义。

要从数字创建 Unicode 字符,您需要使用 pack

hex = 0x0905
[hex].pack("U")
=> "अ"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接