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

Ruby:将编码字符转换为实际的UTF-8字符,ruby,encoding,utf-8,Ruby,Encoding,Utf 8,Ruby不能很好地处理UTF-8字符串。我在一个XML文件中传递数据,尽管XML文档被指定为UTF-8,但它将ascii编码(每个字符两个字节)视为单个字符 我已经开始以“\uxxx”格式对输入字符串进行编码,但是我不知道如何将其转换为实际的UTF-8字符。我一直在这个网站和谷歌上搜索,但毫无结果,我现在很沮丧。我正在使用Ruby 1.8.6 基本上,我想转换字符串'\u03a3'->“∑” 我所拥有的是: data.gsub /\\u([a-zA-Z0-9]{4})/, $1.hex.to_

Ruby不能很好地处理UTF-8字符串。我在一个XML文件中传递数据,尽管XML文档被指定为UTF-8,但它将ascii编码(每个字符两个字节)视为单个字符

我已经开始以“\uxxx”格式对输入字符串进行编码,但是我不知道如何将其转换为实际的UTF-8字符。我一直在这个网站和谷歌上搜索,但毫无结果,我现在很沮丧。我正在使用Ruby 1.8.6

基本上,我想转换字符串'\u03a3'->“∑”

我所拥有的是:

data.gsub /\\u([a-zA-Z0-9]{4})/,  $1.hex.to_i.chr
这当然会导致“931超出字符范围”错误

多谢各位
Tim会因为Ruby字符串将UTF-8编码的代码点视为两个字符而中断吗?如果没有,那你就不必太担心了。如果有东西坏了,请添加评论让我们知道。解决这个问题可能比寻找解决办法要好

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

在任何情况下,
和#x3a3
可能是
\u03a3
的更好替代品\Uxxx用于JSON,但不用于XML。如果您想解析\uxxx格式,请查看一些JSON库是如何解析的。

Ruby(至少1.8.6)没有完全的Unicode支持。仅支持ASCII字符,否则最多只能支持八进制符号(
'\377'
)的
255

证明:

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。这些文档没有显式地声明ASCII,因此支持可能已经扩展——尽管示例在255处停止

或者,你可以试着调查一下。我自己从来没有试过,所以我不知道它会有多大帮助

否则,我认为你目前无法在Ruby中实现你想要的功能。

试试这个:

[0x50].pack("U")

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

您可以将编码传递给:

chr([编码])→ 一串 返回包含由
int
表示的字符的字符串 根据
编码的值

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

因此,不要使用
.chr
,而是使用
.chr(Encoding::UTF_8)

注意,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中运行得非常好。*,但由于它不运行gems,我需要到别处看看。