在红宝石1.8.7中处理不同类型的连字符

时间:2010-10-01 05:51:40

标签: ruby-on-rails ruby unicode hyphen text-normalization

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

我们必须转换的可能破折号为:

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 ―

这些都必须使用gsub转换为Hyphen-minus( - )。 我使用 CharDet gem来检测所获取字符串的字符编码类型。它显示 windows-1252 。我已经尝试 Iconv 将编码转换为ascii。但它正在抛出异常 Iconv :: IllegalSequence

ruby​​ -v => ruby 1.8.7(2009-06-12 patchlevel 174)[i686-darwin9.8.0]
rails -v => Rails 2.3.5
mysql编码=> 'LATIN1'

知道怎么做到这一点吗?

1 个答案:

答案 0 :(得分:0)

警告:我对Ruby一无所知,但您遇到的问题与您正在使用的编程语言无关。

您无需将Hyphen-minus(-) U+002D -转换为simple hyphen/minus (ascii 45);他们是一回事。

您认为数据库编码为latin1。声明“我的数据以ISO-8859-1 aka latin1编码”在那里,“检查在邮件中”和“我当然还会在早上爱你”。它告诉你的只是每个字符的单字节编码。

假设“fetched string”表示“从数据库中提取的字节字符串”,chardet很可能在报告windows-1252又称cp1252时非常正确 - 但这可能是偶然的因为chardet有时似乎在用尽其他可能性时将其报告为默认值。

(a)这些Unicode字符无法解码为latin1cp1252ascii

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但不能解码为latin1ascii

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

这些(很可能是EN DASH)是你真正需要转换为ascii连字符/破折号的东西。 chardet报告为windows-1252的字符串中的内容是什么?

(c)这可以解码为cp1252latin1,但不能解码为ascii

Soft Hyphen   U+00AD  ­

如果字符串包含非ASCII字符,则将其转换为iconv的任何尝试(使用ascii或任何其他方法)都将失败,除非您使用某种“忽略”或“替换”使用?“选项。你为什么要这样做?