代码之家  ›  专栏  ›  技术社区  ›  intellidiot

在Ruby1.8.7中处理不同类型的utf连字符

  •  5
  • intellidiot  · 技术社区  · 14 年前

    我们在数据库中填充了不同类型的连字符/破折号(在某些文本中)。在将它们与一些用户输入文本进行比较之前,我必须将任何类型的破折号/连字符规范化为简单的连字符/减号(ascii45)。

    我们可能需要转换的破折号有:

    Minus(−) U+2212 − or − or −
    Hyphen-minus(-) U+002D -
    Hyphen(-) U+2010
    Soft Hyphen   U+00AD  ­
    Non-breaking hyphen  U+2011  &#8209
    Figure dash(‒)  U+2012 (8210) ‒ or ‒
    En dash(–) U+2013 (8211) –, – or –
    Em dash(—) U+2014 (8212) —, — or —
    Horizontal bar(―) U+2015 (8213) ― or ―
    

    查德特 gem来检测提取字符串的字符编码类型。它正在显现 . 我试过了 编码转换 将编码转换为ascii。但这是个例外 Iconv::非法序列

    ruby-v=>ruby 1.8.7(2009-06-12 patchlevel 174)[i686-darwin9.8.0]
    轨道-v=>轨道2.3.5
    mysql编码=>'latin1'

    1 回复  |  直到 9 年前
        1
  •  0
  •   Community arnoo    4 年前

    注意:我对Ruby一无所知,但是您遇到的问题与所使用的编程语言无关。

    你不需要改变信仰 Hyphen-minus(-) U+002D - simple hyphen/minus (ascii 45)

    你认为数据库编码是 latin1 . 声明“我的数据是用ISO-8859-1编码的,又名拉丁语1”,上面写着“支票在邮件里”和“当然我早上还会爱你”。它告诉你的是,它是一个单字节每字符编码。

    chardet windows-1252 又称作 cp1252 --然而,这可能是偶然的 查德特 有时,当它用尽了其他的可能性时,它似乎会将此报告为违约。

    (a) 无法将这些Unicode字符解码为 拉丁语1 ascii :

    Minus(−) U+2212 − or − or −
    Hyphen(-) U+2010
    Non-breaking hyphen  U+2011  &#8209
    Figure dash(‒)  U+2012 (8210) ‒ or ‒
    Horizontal bar(―) U+2015 (8213) ― or ―
    

    是什么让你觉得它们可能出现在输入或数据库中?

    (b) 这些Unicode字符可以解码成 cp1252型 但不是 拉丁语1 :

    En dash(–) U+2013 (8211) –, – or –
    Em dash(—) U+2014 (8212) —, — or —
    

    这些(很可能是EN破折号)是您真正需要转换为ascii连字符/破折号的内容。那根绳子里是什么 查德特 视窗-1252 ?

    cp1252型 拉丁语1 :

    Soft Hyphen   U+00AD  ­
    

    iconv 或任何其他方法) ascii码 ? “选择。你为什么要这么做?

    推荐文章