解决红宝石1.8.7中不同类型的utf连字符

int*_*iot 5 ruby unicode ruby-on-rails 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 ―
Run Code Online (Sandbox Code Playgroud)

这些都必须使用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'

任何想法如何做到这一点?

Joh*_*hin 1

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

\n

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

\n

您认为数据库编码是latin1. 声明“我的数据采用 ISO-8859-1 aka latin1 进行编码”与“支票已在邮件中”和“当然,早上我仍然会爱你”。它告诉您的只是它是每个字符单字节编码。

\n

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

\n

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

\n
Minus(\xe2\x88\x92) U+2212 − or − or −\nHyphen(-) U+2010\nNon-breaking hyphen  U+2011  &#8209\nFigure dash(\xe2\x80\x92)  U+2012 (8210) ‒ or ‒\nHorizontal bar(\xe2\x80\x95) U+2015 (8213) ― or ―\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n

(b) 这些 Unicode 字符可以解码为cp1252但不能解码latin1为 或ascii

\n
En dash(\xe2\x80\x93) U+2013 (8211) –, – or –\nEm dash(\xe2\x80\x94) U+2014 (8212) —, — or —\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n

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

\n
Soft Hyphen   U+00AD  ­\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n