我有以下字符串:
l\u0092issue
我的问题是如何将其转换为utf8字符?
我试过了
1.9.3p484 :024 > "l\u0092issue".encode('utf-8')
=> "l\u0092issue"
答案 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处理字符编码,有一套很好的文章。您还可以查看String和Encoding的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在那里做的原因)。 \u0092
是this character的转义序列。
如果您的终端字体支持,请尝试puts "l\u0092issue"
查看呈现的字符。