代码之家  ›  专栏  ›  技术社区  ›  Marc Seeger

清除Ruby中的奇怪编码

  •  3
  • Marc Seeger  · 技术社区  · 15 年前

    我现在在玩CouchDB。
    我正在尝试将一些博客数据从redis(键值存储)迁移到couchdb(键值存储)。
    当我把这些数据从不同的博客引擎迁移到不同的博客引擎时(每个人都有一个爱好),似乎有一些编码障碍。
    我正在使用couchrest从ruby访问couchdb,我得到了:

    <JSON::GeneratorError: source sequence is illegal/malformed>
    

    问题似乎是对象的主体HTML部分:

    <Post:0x00000000e9ee18 @body_html="[.....]Wie Sie bereits wissen, m\xF6chte EUserv k\xFCnftig seine  [...]
    

    这些应该是umlauts(“m_¶chte”和“k_¼nftig”)。

    知道如何解决这些问题吗?在插入之前,我尝试了一些使用Ruby1.9编码特性或ICONV的转换,但还没有运气:(

    如果我尝试使用Ruby1.9的.encode()方法将这些内容转换为iso-8859-1,就会发生这种情况(不同的文本,相同的问题):

    #<Encoding::UndefinedConversionError: "\xC6\x92" from UTF-8 to ISO-8859-1>
    
    1 回复  |  直到 15 年前
        1
  •  8
  •   bobince    15 年前

    我试着把那些东西转换成ISO-8859-1

    关闭。你其实想用另一种方式:你 得到了 ISO-8859-1(*),您 希望 UTF-8(**)。所以 str.encode('utf-8', 'iso-8859-1') 会更有可能做到这一点。

    *:实际上,您很可能有Windows代码页1252,类似于ISO-8859-1,但带有额外的智能引号和范围0x80-0x9f的内容,ISO-8859-1用于控制代码。如果是,使用 'cp1252' 相反。

    **:嗯,你 可能 做。使用UTF-8是最好的前进方式,这样您就可以存储所有可能的字符。如果你 真正地 想继续在iso-8859-1/cp1252中工作,那么可能问题是Ruby误猜了正在使用的字符集,您可以通过调用 str.force_encoding('iso-8859-1') .