我对此感到非常困难:
# 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>
关于从哪里开始有什么想法吗?
注意:这是not我的副本上一个问题 https://stackoverflow.com/questions/17042608/convert-unicode-mess-to-correct-characters-in-ruby.
\u008E
表示带有代码点的 unicode 字符8e
(十六进制)出现在字符串中的该点。该字符是控制字符“SINGLE SHIFT TWO”(参见代码表(pdf) http://www.unicode.org/charts/PDF/U0080.pdf)。人物Ž
位于代码点u017d
。然而它处于位置8e
in the Windows CP-1252 https://en.wikipedia.org/wiki/Windows-1252编码。不知何故,你的编码混淆了。
“修复”此问题的最简单方法可能只是打开包含字符串(或数据库记录或其他内容)的文件并将其编辑为正确的。真正的解决方案将取决于有问题的字符串来自哪里以及有多少坏字符串。
假设字符串位于UTF-8编码 http://en.wikipedia.org/wiki/UTF-8, \u008E
将由两个字节组成c2
and 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
where xx
正确的字节(就像在这种情况下),其他的将是c3 yy
where yy
是一个不同的字节。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)