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

Vij*_*jay 3 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>'
Run Code Online (Sandbox Code Playgroud)

有人可以帮我解决这个问题.

shi*_*vam 7

由于Arie已经回答了这个错误,因为无效的字节序列 \xC3

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

a = "abce\xC3"
# => "abce\xC3" 
a.scrub
# => "abce?"
a.scrub.sub("a","A")
# => "Abce?"
Run Code Online (Sandbox Code Playgroud)


Ari*_*iao 5

你需要弄清楚你想要的\xC3是什么.它代表了char Ã吗?

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

"abce\xC3".force_encoding("iso-8859-1").sub('a', 'A')
Run Code Online (Sandbox Code Playgroud)

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

"abce\xC3".force_encoding("ASCII-8BIT").sub('a', 'A')
Run Code Online (Sandbox Code Playgroud)

  • 要将字符串转换为UTF-8,请使用"abce\xC3".force_encoding('iso-8859-1').encode('utf-8')`或者 - 更好的是 - 在读取字符串时设置正确的编码. (2认同)