【发布时间】:2014-01-16 20:07:13
【问题描述】:
我有以下字符串:
l\u0092issue
我的问题是如何将其转换为 utf8 字符?
我试过了
1.9.3p484 :024 > "l\u0092issue".encode('utf-8')
=> "l\u0092issue"
【问题讨论】:
我有以下字符串:
l\u0092issue
我的问题是如何将其转换为 utf8 字符?
我试过了
1.9.3p484 :024 > "l\u0092issue".encode('utf-8')
=> "l\u0092issue"
【问题讨论】:
您的编码似乎有些混乱。如果你还没有,你应该先阅读Joel Spolsky’s article The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!),它很好地介绍了这种类型的东西。在http://graysoftinc.com/character-encodings/understanding-m17n-multilingualization 上有一组很好的关于 Ruby 如何处理字符编码的文章。您还可以查看 String 和 Encoding 的 Ruby 文档。
在这种特定情况下,字符串l\u0092issue 表示第二个字符是unicode codepoint 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"
这只是对正在发生的事情的真正演示。真正的解决方案是确保正确处理编码。
【讨论】:
"l\u0092issue".encode('iso-8859-1').force_encoding('cp1252').encode('utf-8')
编码为 UTF-8(除非您更改了原始字符串编码)。当您inspect 字符串时,Ruby 只是向您显示转义序列(这就是 IRB 这样做的原因)。 \u0092 是 this character 的转义序列。
如果您的终端字体支持,请尝试puts "l\u0092issue" 查看呈现的字符。
【讨论】:
"l\u0092issue".encode('iso-8859-1').force_encoding('cp1252').encode('utf-8') 显示正确的字符,但 puts "l\u0092issue" 不显示。