将unicode字符串转换为Ruby中的字符?

时间:2014-01-16 20:07:14

标签: ruby string

我有以下字符串:

l\u0092issue

我的问题是如何将其转换为utf8字符?

我试过了

1.9.3p484 :024 > "l\u0092issue".encode('utf-8')
 => "l\u0092issue" 

2 个答案:

答案 0 :(得分:13)

你好像把你的编码混淆了一下。如果你还没有,你应该先阅读Joel Spolsky’s article The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!),它提供了对这类事物的一个很好的介绍。关于Ruby如何在http://graysoftinc.com/character-encodings/understanding-m17n-multilingualization处理字符编码,有一套很好的文章。您还可以查看StringEncoding的Ruby文档。

在这种特定情况下,字符串l\u0092issue表示第二个字符是具有unicode代码点0x92的字符。此代码点为PRIVATE USE TWO(请参阅chart),这基本上意味着此位置未被使用。

然而,看Windows CP-1252 encoding,位置0x92被字符占用,所以如果这是缺少的字符,字符串将是l’issue,看起来更多即使我不说法语也可能。

我怀疑发生的事情是你的程序收到了CP-1252中编码的字符串l’issue,但假设它是用ISO-8859-1编码的(ISO-8859-1和CP-1252是相当的)紧密相关)并将其重新编码为UTF-8,留下你现在拥有的字符串。

真正的修复方法是要小心进入(和离开)程序的任何字符串的编码,以及如何管理它们。

要将字符串转换为l’issue,您可以encode将其转回ISO-8859-1,然后使用force_encoding告诉Ruby 真正的编码CP-1252,然后你可以重新编码为UTF-8:

2.1.0 :001 > s = "l\u0092issue"
 => "l\u0092issue" 
2.1.0 :002 > s = s.encode('iso-8859-1')
 => "l\x92issue" 
2.1.0 :003 > s.force_encoding('cp1252')
 => "l\x92issue" 
2.1.0 :004 > s.encode('utf-8')
 => "l’issue"

这只能说明发生了什么。真正的解决方案是确保您正确处理编码。

答案 1 :(得分:4)

编码为UTF-8(除非您更改了原始字符串编码)。当你inspect字符串时,Ruby就会向你展示转义序列(这就是IRB在那里做的原因)。 \u0092this character的转义序列。

如果您的终端字体支持,请尝试puts "l\u0092issue"查看呈现的字符。