Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.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
UTF-8 Ruby中的字节序列无效_Ruby_Character Encoding_Ruby 2.0 - Fatal编程技术网

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Ã"