【问题标题】:Ruby: Convert encoded character to actual UTF-8 characterRuby:将编码字符转换为实际的 UTF-8 字符
【发布时间】:2010-12-17 05:45:29
【问题描述】:

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

谢谢 蒂姆

【问题讨论】:

  • 请注意,UTF-8 并不是每个字符两个字节。每个代码点 1 到 4 个字节。如果您的 gsub 确实有效,则输出不会是 UTF-8 - 它可能更接近 UCS-2 或 UTF-32,具体取决于数字的大小。
  • 对我来说,答案是放弃 Ruby。我正在用 .NET 重写这段代码,因为我没有时间继续尝试使用 Ruby。我升级到 1.9.1,它不包括运行所需的大量 DLL。添加这些之后,事实证明许多 gem 在 1.9.* 中被破坏,因为它们使用二进制 gem 格式,对 1.8.* DLL 的引用进行硬编码。最终脚本如下所示:data.gsub (/\\u[a-zA-Z0-9]{4}/){|s| eval('"' + s + '"')} 这在 1.9.* 中完美运行,但由于它不运行我需要的 gem,我需要在其他地方查看。

标签: ruby encoding utf-8


【解决方案1】:

您可以将编码传递给Integer#chr

chr([编码]) → 字符串

返回一个字符串,其中包含int 所代表的字符 值根据encoding

65.chr    #=> "A"
230.chr   #=> "\xE6"
255.chr(Encoding::UTF_8)   #=> "\u00FF"

所以不要使用.chr,而是使用.chr(Encoding::UTF_8)

【讨论】:

    【解决方案2】:

    试试这个:

    [0x50].pack("U")
    

    0x50 是 utf8 字符的十六进制代码。

    【讨论】:

      【解决方案3】:

      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 中完成您想要的工作。

      【讨论】:

        【解决方案4】:

        是否因为 Ruby 字符串将 UTF-8 编码的代码点视为两个字符而导致出现问题?如果没有,那么你不应该为此担心太多。如果确实有问题,请添加评论让我们知道。解决这个问题可能比寻找解决方法更好。

        如果您需要进行转换,请查看 Iconv 库。

        无论如何,Σ 可能是\u03a3 的更好替代品。 \uXXXX 用于 JSON,但不用于 XML。如果你想解析 \uXXXX 格式,看看一些 JSON 库他们是怎么做的。

        【讨论】:

          猜你喜欢
          • 2014-01-18
          • 1970-01-01
          • 1970-01-01
          • 2011-12-08
          • 2011-05-20
          • 1970-01-01
          • 1970-01-01
          • 2013-01-16
          相关资源
          最近更新 更多