Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Ruby中将转义unicode(\u008E)转换为重音字符(Ž;)?_Ruby_Encoding - Fatal编程技术网

在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编码的。