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

标签 ruby string

我有以下字符串:

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/

相关文章:

ruby-on-rails - 允许多维参数

mysql - 用于连接 has_and_belongs_to_many 关系的 ActiveRecord 查询

Java 正则表达式 : Remove all except specific phrases and words

java - Java中的正则表达式匹配

javascript - 在配置中使用 loadNetzkeComponent 的参数

ruby-on-rails - R14 - 超出内存配额

ruby - 将 puppet 路径映射到绝对路径

c# - 如何检查字符串是否包含单次出现的子字符串?

swift - 在内部函数中传递 CVarArg

c++ - 将 std::string 正确写入二进制文件