Ruby on rails 在ruby 1.8.7中处理不同类型的utf连字符

Ruby on rails 在ruby 1.8.7中处理不同类型的utf连字符,ruby-on-rails,ruby,unicode,hyphen,text-normalization,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-

我们在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转换为连字符减号(-)。 我使用了CharDetgem来检测提取字符串的字符编码类型。它正在显示windows-1252。我已尝试将编码转换为ascii。但是它抛出了一个异常Iconv::IllegalSequence

ruby-v=>ruby 1.8.7(2009-06-12补丁级别174)[i686-darwin9.8.0]
rails-v=>rails 2.3.5
mysql编码=>'latin1'

你知道如何做到这一点吗?

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

您不需要转换
连字符减号(-)U+002D-
简单连字符/减号(ascii 45)
;它们是一样的

您认为数据库编码是
latin1
。“我的数据是用ISO-8859-1又名拉丁语编码的”这句话与“支票在邮寄中”和“当然我早上还会爱你”一起出现。它告诉你的是,它是一个单字节每字符编码

假定“获取的字符串”意味着“从数据库提取的字节字符串”
chardet
在报告
windows-1252
aka
cp1252
时很可能是非常正确的,但是这可能是偶然的,因为
chardet
有时似乎在用尽其他可能性时会将其作为默认报告

(a) 无法将这些Unicode字符解码为
latin1
cp1252
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 ―
En dash(–) U+2013 (8211) –, – or –
Em dash(—) U+2014 (8212) —, — or —
Soft Hyphen   U+00AD  ­
是什么让您觉得它们可能出现在输入或数据库中

(b) 这些Unicode字符可以解码为
cp1252
,但不能解码为
latin1
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 ―
En dash(–) U+2013 (8211) –, – or –
Em dash(—) U+2014 (8212) —, — or —
Soft Hyphen   U+00AD  ­
这些(很可能是EN-DASH)是您真正需要转换为ascii连字符/破折号的内容。
chardet
报告为
windows-1252
的字符串中有什么内容

(c) 可以将其解码为
cp1252
latin1
,但不能解码为
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 ―
En dash(–) U+2013 (8211) –, – or –
Em dash(—) U+2014 (8212) —, — or —
Soft Hyphen   U+00AD  ­
如果字符串包含非ASCII字符,任何尝试(使用
iconv
或任何其他方法)将其转换为
ASCII
的操作都将失败,除非使用某种“忽略”或“替换为
”选项。你为什么要这么做