【问题标题】:Encoding in ruby utf-8 errorruby utf-8 编码错误
【发布时间】:2017-10-24 10:51:48
【问题描述】:

我想转换这个字符串

"Nous travaillons \u00c3\u00a1 rendre"

Nous travaillons à rendre

但做不到。我在字符串上尝试了force_encoding("UTF-8") 方法,但也没有用。我的输出总是

"Nous travaillons á rendre"

似乎唯一有效的是,如果我手动将 \u00 替换为 \x

"Nous travaillons \xc3\xa1 rendre"

但是gsub 似乎没有在处理这个"Nous travaillons \u00c3\u00a1 rendre"

我正在使用 ruby​​ 1.9.3

【问题讨论】:

  • 必填项:您使用 ruby​​ 1.9.3 有充分的理由吗?此版本,不再受支持。
  • 我正在为 Sinatra 应用程序添加一个修复程序,它在 1.9.3 上
  • 您也许可以将字节序列 0xC3 0xA1 转换为 á,但将 á 转换为 à 是拼写检查问题,而不是编码问题。

标签: ruby utf-8


【解决方案1】:

您是否尝试过:“Nous travaillons \u00E0 rendre”?

您想要的字符(带有坟墓的拉丁小写字母 A)是 单个 unicode 字符。这意味着如果您使用 \u,您只需要 一个 转义序列,而不是您的问题的两个。您混淆了 Unicode 代码点(字符)和 UTF-8 编码的概念。

如果你想在你的字符串中表示 UTF-8 编码,你应该使用 two \x 序列...如果你想表示编码字符本身,你应该使用 one \u 序列。

只有您对 \u 的错误使用才使您不得不求助于 force_encoding

【讨论】:

    【解决方案2】:

    您必须在此之后对字符串进行编码并强制编码。

    "Nous travaillons á rendre".encode("Windows-1252").force_encoding("utf-8")
    

    结果:

    "Nous travaillons á rendre"
    

    【讨论】:

    • 谢谢,但这是来自 (irb):162` 的错误 Encoding::UndefinedConversionError: U+2019 from UTF-8 to ISO-8859-1 from (irb):162:in encode'
    • 注:(1)编码可能实际上是Windows-1252,而不是iso-8859-1?并且 (2) looks to me 就像正确的字符 is 实际上是 á,而不是 à (??)
    • @SumeetMasih 是来自 longer 输入字符串的错误吗?如果是这样,你能找到一个简单的复制品吗?如果没有,我的替代编码建议是否有效?关于正确编码的线索可能来自原始数据源——它是什么? MS Word?
    • @TomLord 是的,你是对的。 Windows-1252 是真实格式。我更新了帖子。
    • @SumeetMasih 我认为问题在于 Ruby 版本是 1.9.3。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多