如何使用ruby 1.9转换字​​符编码

我目前在亚马逊api的结果方面遇到麻烦。

该服务返回一个带有unicode字符的字符串: 在Mac上学习Objective \ xE2 \ x80 \ x93C(学习系列)

使用ruby 1.9.1,甚至无法处理字符串:

REXML::ParseException: # ... Exception parsing Line: 1 Position: 1636 Last 80 unconsumed characters: Learn Objective–C on the Mac (Learn Series) 

作为例外点,您的字符串是ASCII-8BIT编码的。 您应该更改编码。 有一个很长的故事 ,但如果你对快速解决方案感兴趣,只需在执行任何处理之前对字符串force_encoding

 s = "Learn Objective\xE2\x80\x93C on the Mac" # => "Learn Objective\xE2\x80\x93C on the Mac" s.encoding # => # s.force_encoding 'utf-8' # => "Learn Objective–C on the Mac" 

如果用ASCII-8BIT编码的所有东西都可以直接转换为UTF-8,那么Mladen的解决方案就可以工作。 当有1)无效的字符或2)UTF-8中未定义的字符时,它会中断。 但是,这将有效(在1.9.2及更高版本中:

 new_str = s.encode('utf-8', 'binary', :invalid => :replace, :undef => :replace, :replace => '') 

ASCII-8BIT实际上是二进制的。 此代码将编码转换为UTF-8,同时正确处理无效和未定义的字符。 :invalid选项指定替换无效字符。 :undef选项指定替换未定义的字符。 并且:replace选项定义了应该替换无效或未定义字符的内容。 在这种情况下,我选择简单地删除它们。