【问题标题】:Ruby 1.9.2 Character Encoding: invalid multibyte character: /?/Ruby 1.9.2 字符编码:无效的多字节字符:/?/
【发布时间】:2011-11-22 01:03:12
【问题描述】:

我试图理解为什么这个 sn-p 代码在 Ruby 1.9.2 中不起作用我还试图弄清楚应该如何改变它才能使其工作。这是sn-p:

ruby-1.9.2-p290 :009 > str = "hello world!"
 => "hello world!" 
ruby-1.9.2-p290 :010 > str.gsub("\223","")
RegexpError: invalid multibyte character: /?/
    from (irb):10:in `gsub'

【问题讨论】:

  • 你希望你的“\223”字符是什么?
  • 我认为 \223 是左双引号,而 \224 是右双引号。我对编码不够熟悉,无法告诉您更多信息。

标签: ruby encoding


【解决方案1】:

您的 ruby​​ 处于 UTF-8 模式,但 "\223" 不是有效的 UTF-8 字符串。当您使用 UTF-8 时,任何设置了第 8 位的字节都意味着您处于多字节字符中,您需要继续读取更多字节才能获得完整字符;这意味着 "\223" 只是 UTF-8 编码字符的 一部分,因此您的错误。

0223 和 0224(十进制的 147 和 148)是 Windows-1252 字符集中的“智能”引号,但 Windows-1252 不是 UTF-8。在 UTF-8 中,您需要 "\u201c""\u201d" 作为引号:

>> puts "\u201c"
“
>> puts "\u201d"
”

因此,如果您想去掉引号,那么您可能需要以下之一:

str.gsub("\u201c", "").gsub("\u201d", "")
str.gsub(/[\u201c\u201d]/, '')

【讨论】:

  • 你怎么知道0223"\u201c"
  • 你能告诉我 'ô' 的 unicode 等价物吗?我需要它..请
  • 我实际上并没有在这个table 2 "\u201d""\u201c" 中找到.. 请帮帮我。
  • @Arup:经验告诉我,这类编码问题通常是有人将 Latin-1 或 Windows-1252 视为 UTF-8,所以我查看了 Latin-1 和 Windows-1252 字符表看看0223 的内容,Latin-10x93 没有任何内容,但Windows-1252 有。然后你只需要回溯到 Unicode 版本。您需要查看General Punctuation 页面。
  • 可能在 irb 中使用 "\223".force_encoding('windows-1252').encode('utf-8')[0].ord.to_s(16) 之类的东西来获取十六进制值。然后,一旦你有了 Unicode 十六进制值,就很容易了。
猜你喜欢
  • 2011-07-25
  • 2011-04-10
  • 2012-09-22
  • 2019-12-11
  • 2011-06-09
  • 1970-01-01
  • 2010-12-16
  • 1970-01-01
  • 2016-11-08
相关资源
最近更新 更多