在 ruby 1.8.7 中处理不同类型的 utf 连字符
Posted
技术标签:
【中文标题】在 ruby 1.8.7 中处理不同类型的 utf 连字符【英文标题】:tackle different types of utf hyphens in ruby 1.8.7 【发布时间】:2011-04-19 16:58:07 【问题描述】:我们在 db.xml 中填充了不同类型的连字符/破折号(在某些文本中)。在将它们与一些用户输入文本进行比较之前,我必须将任何类型的破折号/连字符标准化为简单的连字符/减号(ascii 45)。
我们必须转换的可能的破折号是:
Minus(−) U+2212 − or − or −
Hyphen-minus(-) U+002D -
Hyphen(-) U+2010
Soft Hyphen U+00AD ­
Non-breaking hyphen U+2011 ‑
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 补丁级别 174) [i686-darwin9.8.0] rails -v => Rails 2.3.5 mysql 编码 => 'latin1'
知道如何做到这一点吗?
【问题讨论】:
【参考方案1】:警告:我对 Ruby 一无所知,但您遇到的问题与您使用的编程语言无关。
您不需要将Hyphen-minus(-) U+002D -
转换为simple hyphen/minus (ascii 45)
;它们是一样的。
您认为数据库编码是latin1
。声明“我的数据以 ISO-8859-1 aka latin1 编码”与“支票在邮件中”和“当然我早上仍然会爱你”一起出现。它告诉你的只是它是一个单字节/字符的编码。
假设“获取的字符串”表示“从数据库中提取的字节字符串”,chardet
很可能在报告 windows-1252
又名 cp1252
时非常正确——但这可能是偶然的,因为 chardet
有时看起来在用尽其他可能性时将其报告为默认值。
(a) 这些 Unicode 字符无法解码为latin1
或cp1252
或ascii
:
Minus(−) U+2212 − or − or −
Hyphen(-) U+2010
Non-breaking hyphen U+2011 ‑
Figure dash(‒) U+2012 (8210) ‒ or ‒
Horizontal bar(―) U+2015 (8213) ― or ―
什么让您觉得它们可能出现在输入或数据库中?
(b) 这些 Unicode 字符可以解码为cp1252
,但不能解码为latin1
或ascii
:
En dash(–) U+2013 (8211) –, – or –
Em dash(—) U+2014 (8212) —, — or —
这些(很可能是 EN DASH)是您真正需要转换为 ascii 连字符/破折号的内容。 chardet
报告为 windows-1252
的字符串中有什么内容?
(c) 这可以解码为cp1252
和latin1
但不能解码为ascii
:
Soft Hyphen U+00AD ­
如果字符串包含非 ASCII 字符,任何尝试(使用 iconv
或任何其他方法)将其转换为 ascii
的尝试都将失败,除非您使用某种“忽略”或“替换为 ?
“ 选项。你为什么要这么做?
【讨论】:
以上是关于在 ruby 1.8.7 中处理不同类型的 utf 连字符的主要内容,如果未能解决你的问题,请参考以下文章
ruby 1.8.7 和 2.1 之间的 DBI 行/委托行为
请建议适当的附件插件/宝石用于 Rails 2.0.2 和 Ruby 1.8.7