UTF-8 中的无效字节序列 Ruby

Invalid Byte Sequence In UTF-8 Ruby

我有这样的字符串 "abce\xC3".sub("a","A"),当我执行该行时出现以下错误。

ArgumentError: invalid byte sequence in UTF-8
    from (irb):20:in `sub'
    from (irb):20
    from /home/vijay/.rvm/rubies/ruby-2.0.0-p598/bin/irb:12:in `<main>'

谁能帮我解决这个问题。

你需要弄清楚你想要 \xC3 是什么。它代表字符 Ã?

您看到错误是因为 \xC3 不是(默认)UTF-8 编码中的有效字节序列。你可以先纠正String的编码(通过回答上面的问题),然后再做替换。

"abce\xC3".force_encoding("iso-8859-1").sub('a', 'A')

或者如果编码无关紧要,比如说,您正在处理字节序列而不是字符序列,您可以强制编码为 ASCII-8BIT

"abce\xC3".force_encoding("ASCII-8BIT").sub('a', 'A')

正如 Arie 已经回答的,这个错误是因为无效的字节序列 \xC3

如果您使用的是 Ruby 2.1 +,您还可以使用 String#scrub 将无效字节替换为给定的替换字符。这里:

a = "abce\xC3"
# => "abce\xC3" 
a.scrub
# => "abce�"
a.scrub.sub("a","A")
# => "Abce�"

关于您的/实际问题:

"ITZVÃ" is content of file. When i read the file.

 z = File.open("x")
 z.read(5)

Then output should be ITZV\xC3\x83 instead i am getting ITZV\xC3

这是因为在 UTF-8 中,Ã 是一个多字节字符,即您的字符串有 5 个 个字符 ,但有 6 个 个字节 :

"ITZVÃ".chars #=> ["I", "T", "Z", "V", "Ã"]
"ITZVÃ".bytes #=> [ 73,  84,  90,  86, 195, 131]

z.read(5) 从您的文件中读取 5 字节 ,因此返回不完整的 UTF-8 字符串:

require 'tempfile'

z = Tempfile.new('foo')
z << 'ITZVÃ'

z.rewind
z.read(5) #=> "ITZV\xC3"

您必须改为读取 6 个字节:

z.rewind
z.read(6) #=> "ITZV\xC3\x83"

注意 read 总是 returns ASCII-8BIT 编码的字符串。您必须手动设置不同的编码:

z.rewind
z.read(6).force_encoding('utf-8') #=> "ITZVÃ"