我有以下字符串:
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 的 Ruby 文档和 Encoding .
在此特定情况下,字符串 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"
不过,这实际上只是对正在发生的事情的演示。真正的解决方案是确保您正确处理编码。
关于ruby - 将 unicode 字符串转换为 Ruby 中的字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21171782/