1

运行从 JSON 文件生成已翻译 HTML 文件的 Ruby 脚本时,我收到 ParserError。JSON 文件的编码是 ISO-8859-1,但是当我运行 ruby​​ 代码时,我得到以下信息:

:marker=>true}
C:/Ruby200/lib/ruby/2.0.0/json/common.rb:155:in `parse': 757: unexpected token a
t '{ (JSON::ParserError)
    "de_DE": {
        "1": "HERBST 2013",
        "2": "STILSICHER",
                "3": "Klassisch geschnittene Anzüge",
                "4": "PERFEKT KOMBINIERT",
                "5": "Business hemden mit klasse",
                "6": "HERBST 2013",
                "7": "CASUAL BIS COCKTAIL",
                "8": "Vielseitige Kleider",
                "9": "SPORTIV BIS ELEGANT",
                "10": "Mäntel mit Anspruch",
                "11": "ELEGANZ NACH MASS",
                "12": "Unverwechselbare",
                "13": "PASSGENAU",
                "14": "Perfekt geschnittene Blazer"
    },
    "en_GB": {
        "1": "FALL 2013",
        "2": "PURE STYLE",
...............

是否出于某种原因更改了外来字符?

在红宝石脚本中,我有:

translation_hash = JSON.parse(File.read('translation_master.json').force_encoding("ISO-8859-1").encode("utf-8", replace: nil))

http://rubyfiddle.com/riddles/d17fd

这里的json文件:

http://alexanderlloyd.info/json/translation_master.json

4

2 回答 2

2

您是否以 UTF8 格式读取文件?除非另有说明,否则 Ruby 1.9 将假定文件是 UTF-8。

JSON.parse open("input.json", "r:iso-8859-1:utf-8").read

这将指定文件包含 ISO-8859-1 编码,然后在读取时将其转码为 UTF-8。

如果你能提供一个测试文件,它可能更容易帮助调试。

于 2013-07-10T21:19:49.213 回答
2

首先,这个家伙jadala是我在这里所说的内容的作者。

一些背景

Latin1 是 MySQL 使用的字符编码。人们错误地认为它等同于 ISO-8859-1,其实不然,它实际上是 CP-1252(也称为 Windows-1252)。CP-1252 是 ISO-8859-1 的超集,带有一些附加字符(最近包括 € 符号)。

尝试应用这个:

def fix_cp1252_utf8(text)
    text.encode('cp1252',
        :fallback => {
            "\u0081" => "\x81".force_encoding("cp1252"),
            "\u008D" => "\x8D".force_encoding("cp1252"),
            "\u008F" => "\x8F".force_encoding("cp1252"),
            "\u0090" => "\x90".force_encoding("cp1252"),
            "\u009D" => "\x9D".force_encoding("cp1252")
          })
  .force_encoding("utf-8")
end

看看这里:

在 Ruby 中解决 Latin1 和 UTF8 错误

Ruby 1.9 编码:Rails 入门和解决方案

于 2015-08-20T12:25:58.847 回答