5

我们在 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 转换为连字符减号(-)。我使用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 encoding => 'latin1'

知道如何做到这一点吗?

4

1 回答 1

1

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

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

您认为数据库编码是latin1. 声明“我的数据以 ISO-8859-1 aka latin1 编码”与“支票在邮件中”和“当然我早上仍然会爱你”一起出现。它告诉你的只是它是一个单字节/字符编码。

假设“获取的字符串”意味着“从数据库中提取的字节字符串”,chardet在报告中很可能是完全正确的windows-1252——cp1252但这可能是偶然的,因为chardet有时似乎在用尽其他可能性时将其报告为默认值。

(a) 这些 Unicode 字符不能被解码为latin1orcp1252ascii

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

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

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

(c) 这可以解码为cp1252andlatin1但不是ascii

Soft Hyphen   U+00AD  ­

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

于 2010-10-09T23:07:41.287 回答