UTF-8 Ruby中的字节序列无效
我有这样的字符串UTF-8 Ruby中的字节序列无效,ruby,character-encoding,ruby-2.0,Ruby,Character Encoding,Ruby 2.0,我有这样的字符串“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>' ArgumentError:UTF-8中的字节序列无效 发件人(
“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>'
ArgumentError:UTF-8中的字节序列无效
发件人(irb):20:in'sub'
起始(irb):20
from/home/vijay/.rvm/rubies/ruby-2.0.0-p598/bin/irb:12:in`'
有人能帮我解决这个问题吗。你需要弄清楚你想要的
\xC3
是什么。它是否表示字符Ã
您看到错误是因为\xC3
在(默认)UTF-8编码中不是有效的字节序列。您可以首先更正字符串的编码(通过回答上述问题),然后进行替换
"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+,还可以使用替换字符替换无效字节。在这里:
a = "abce\xC3"
# => "abce\xC3"
a.scrub
# => "abce�"
a.scrub.sub("a","A")
# => "Abce�"
关于您的/实际问题:
“ITZVÔ
是文件的内容。当我读文件的时候
z = File.open("x")
z.read(5)
然后输出应该是ITZV\xC3\x83
,而不是我得到的ITZV\xC3
这是因为在UTF-8中,Ã
是一个多字节字符,即字符串有5个字符,但有6个字节:
z.read(5)
从文件中读取5个字节,从而返回不完整的UTF-8字符串:
require 'tempfile'
z = Tempfile.new('foo')
z << 'ITZVÃ'
z.rewind
z.read(5) #=> "ITZV\xC3"
请注意,始终返回ASCII-8位编码的字符串。您必须手动设置不同的编码:
z.rewind
z.read(6).force_encoding('utf-8') #=> "ITZVÃ"
字节“\xC3”不是有效的UTF-8字符。当您从源代码(或您关于如何操作Ruby字符串的假设)获取此值时,您的问题会以某种方式出现。要获得帮助,您需要解释一下这个值应该代表什么,或者它是如何读入程序的。这个
\xC3
来自哪里?在UTF-8中,它意味着第二个字节(如ä
的\xA4
)必须跟在后面。“ITZVÔ这是确切的字符串。我正在处理。Ruby 2.2似乎没有出现错误,即sub
处理/跳过无效的字节序列。“ITZVÔ是文件的内容。当我读文件的时候<代码>z=文件。打开(“x”);z、 读(5)代码>然后输出应该是ITZV\xC3\x83
,而我得到的是ITZV\xC3
@Stefan知道ruby中为什么会出现这种情况吗?你是如何找到\xC3的?要将字符串转换为UTF-8,请使用“abce\xC3”。强制编码('iso-8859-1')。编码('UTF-8')
,或者更好的是,在读取字符串时设置正确的编码。@Vijay它是一个单字节,超出了正常ASCII编码的范围,所以我尝试了
z.rewind
z.read(6) #=> "ITZV\xC3\x83"
z.rewind
z.read(6).force_encoding('utf-8') #=> "ITZVÃ"