在Ruby中将转义unicode(\u008E)转换为重音字符(Ž;)?
我在这方面遇到了非常困难的时刻:在Ruby中将转义unicode(\u008E)转换为重音字符(Ž;)?,ruby,encoding,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":byte
# 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>
#包含在:
“MA\u008EEIKIAI”
#应该是
“MAŽEIKIAI”
#弦的性质
$p.3
“MA\u008EEIKIAI”
$3
前桥
$3.5
“\“MA\\u008EEIKIAI”
$3.0字节
#
关于从哪里开始有什么想法吗
注意:这不是我的。使用
Regexp
和String\35; pack
转换Unicode转义码怎么样
str=“MA\\u008EEIKIAI”
放置str#=>MA\u008EEIKIAI
str.gsub!(/\\u(.{4})/)不匹配|
[1.to_i(16)]包装('U')
结束
放置str#=>马爱凯
\u008E
表示带代码点8e
(十六进制)的unicode字符出现在字符串的该点。此字符是控制字符“单移位二”(请参阅)。字符Ž
位于代码点u017d
。但是,它位于编码中的位置8e
。不知怎的,你把你的编码搞混了
“修复”此问题的最简单方法可能是打开包含字符串(或数据库记录或其他内容)的文件,并对其进行编辑以使其正确。真正的解决方案将取决于所讨论的字符串来自何处以及有多少坏字符串
假设字符串在中,\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
是不同的字节。那么它可能应该是“MAŽEIKIAI”
而不是“MAžEIKIAI”
我说过忽略case@padde,正确的?我认为发布准确的预期结果比添加注释忽略案例更容易。@Wooble一点也不重复,而且这个问题没有任何答案,甚至几乎可以回答这个问题。@Wooble:实际上它打印了,但肯定不是Ž
。我开始认为gsub
是最好的选择。谢谢我会尝试一下。唯一的问题是我的字符串似乎没有转义unicode。我可以使用inspect
进行转义,但这会产生MAEIKIAI
。我使用的文本字符串是MA\u008EEIKIAI
,而不是MA\\u008EEIKIAI
@Zenph,那么您根本不需要转义该字符串String#inspect
是字符串的“源代码”表示形式,您可以将其复制/粘贴到源代码中,然后Ruby愉快地接受它。因此,字符串的inspect
版本将包含前导和尾随“
,但是,基础字符串没有这两个字符。我已更新了我的问题,以显示您在回答中给出的字符串与我正在处理的实际字符串之间的差异。@Zenph您根本不需要转换string3
包含您需要的字符串MAŽEIKIAI
String#p
展示了如何在ruby代码中对其进行编码。而Kernel#put
显示了字符串的确切含义。我有500k个坏字符串。真是一场噩梦!谢谢,我相信这会让我更接近最终的解决方案,但我有一种感觉,那就是必须做出妥协。@Zenph我怀疑你可能在Ž方面有问题,特别是因为它在CP-1252中,你可能有很多其他iso-8859-1(拉丁语1)中的字符。CP-1252是8859-1的超集。没错,我相信数据最初是用拉丁语1编码的。