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Ã"
我有这样的字符串 "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 gettingITZV\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Ã"