【发布时间】: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,我需要在其他地方查看。