Ruby:将编码字符转换为实际的UTF-8字符

时间:2009-11-16 22:08:15

标签: ruby encoding utf-8

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”错误。

谢谢 添

4 个答案:

答案 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)