Ruby不会使用UTF-8字符串。我在XML文件中传递数据,虽然XML文档被指定为UTF-8,但它将ascii编码(每个字符两个字节)视为单个字符。
我已经开始以“\ uXXXX”格式编码输入字符串,但我无法弄清楚如何将其转换为实际的UTF-8字符。我一直在这个网站上搜索并谷歌无济于事,我现在的挫折感非常高。我使用的是Ruby 1.8.6
基本上,我想转换字符串'\ u03a3' - > “Σ”。
我拥有的是:
data.gsub /\\u([a-zA-Z0-9]{4})/, $1.hex.to_i.chr
当然,这会给出“931 out of char range”错误。
谢谢 添
答案 0 :(得分:5)
试试这个:
[0x50].pack("U")
其中0x50
是utf8 char的十六进制代码。
答案 1 :(得分:2)
因为Ruby字符串将UTF-8编码的代码点视为两个字符,所以会有什么问题吗?如果没有,那么你不应该过分担心。如果出现问题,请添加评论以告知我们。解决这个问题可能更好,而不是寻找解决方法。
如果您需要进行转换,请查看Iconv库。
无论如何,Σ
可能是\u03a3
的更好替代品。 \ uXXXX用于JSON,但不用于XML。如果要解析\ uXXXX格式,请查看一些JSON库如何执行此操作。
答案 2 :(得分:1)
Ruby(至少1.8.6)没有完整的Unicode支持。 Integer#chr
仅支持ASCII字符,否则最多只支持255
八进制表示法('\377'
)。
演示:
irb(main):001:0> 255.chr
=> "\377"
irb(main):002:0> 256.chr
RangeError: 256 out of char range
from (irb):2:in `chr'
from (irb):2
您可以尝试升级到Ruby 1.9。 chr
文档没有明确说明ASCII,因此支持可能已经扩展 - 尽管示例停在255处。
或者,您可以尝试调查ruby-unicode。我自己从未尝试过,所以我不知道它会有多好帮助。
否则,我认为你现在不能在Ruby中做到你想做的事。
答案 3 :(得分:0)
您可以将编码传递给Integer#chr
:
chr([encoding])→字符串
返回一个字符串,其中包含由
int
表示的字符 值根据encoding
。65.chr #=> "A" 230.chr #=> "\xE6" 255.chr(Encoding::UTF_8) #=> "\u00FF"
因此,不要使用.chr
,而要使用.chr(Encoding::UTF_8)
。