将转义后的unicode(\ u008E)转换为Ruby中的重音字符(Ž)?

时间:2013-06-11 12:14:40

标签: ruby encoding

我正处于非常艰难的时期:

# contained within:
"MA\u008EEIKIAI"

# should be
"MAŽEIKIAI"

# nature of string
$ p string3
"MA\u008EEIKIAI" 

$ puts string3
MAEIKIAI

$ string3.inspect
"\"MA\\u008EEIKIAI\""

$ string3.bytes
#<Enumerator: "MA\u008EEIKIAI":bytes> 

关于从哪里开始的任何想法?

注意: 不是我previous question的副本。

2 个答案:

答案 0 :(得分:6)

\u008E表示带有代码点8e(十六进制)的unicode字符出现在字符串中的该点。该字符是控制字符“SINGLE SHIFT TWO”(参见code chart (pdf))。角色Ž位于代码点u017d。但是,它位于Windows CP-1252编码中的8e位置。不知何故,你的编码混乱了。

“修复”这个的最简单方法可能只是打开包含字符串(或数据库记录或其他)的文件,并将其编辑为正确。真正的解决方案将取决于相关字符串的来源以及您拥有的错误字符串数。

假设字符串位于UTF-8 encoding\u008E将包含两个字节c28e。请注意,第二个字节8e与CP-1252中Ž的编码相同。在转换字符串的方式将是这样的:

string3.force_encoding('BINARY') # treat the string just as bytes for now
string3.gsub!(/\xC2/n, '')       # remove the C2 byte
string3.force_encoding('CP1252') # give the string the correct encoding
string3.encode('UTF-8')          # convert to the desired encoding

请注意,这不是解决此类问题的一般解决方案。并非所有CP-1252字符在被修改并以UTF-8表示时都会像这样进行转换。有些将是两个字节c2 xx,其中xx是正确的字节(如本例所示),其他字节为c3 yy,其中yy是不同的字节。

答案 1 :(得分:4)

如何使用Regexp&amp; String#pack转换Unicode转义?

str = "MA\\u008EEIKIAI"
puts str    #=> MA\u008EEIKIAI

str.gsub!(/\\u(.{4})/) do |match|
  [$1.to_i(16)].pack('U')
end
puts str    #=> MA EIKIAI