我正处于非常艰难的时期:
# 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的副本。
答案 0 :(得分:6)
\u008E
表示带有代码点8e
(十六进制)的unicode字符出现在字符串中的该点。该字符是控制字符“SINGLE SHIFT TWO”(参见code chart (pdf))。角色Ž
位于代码点u017d
。但是,它位于Windows CP-1252编码中的8e
位置。不知何故,你的编码混乱了。
“修复”这个的最简单方法可能只是打开包含字符串(或数据库记录或其他)的文件,并将其编辑为正确。真正的解决方案将取决于相关字符串的来源以及您拥有的错误字符串数。
假设字符串位于UTF-8 encoding,\u008E
将包含两个字节c2
和8e
。请注意,第二个字节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