5

データベースにはさまざまな種類のハイフン/ダッシュ (一部のテキスト) が入力されています。それらをユーザー入力テキストと比較する前に、任意のタイプのダッシュ/ハイフンを単純なハイフン/マイナス (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が表示されています。エンコーディングをASCIIに変換するためにIconvを試しました。しかし、例外Iconv::IllegalSequenceをスローしています。

ruby -v => ruby​​ 1.8.7 (2009-06-12 パッチレベル 174) [i686-darwin9.8.0]
rails -v => Rails 2.3.5
mysql エンコーディング => 'latin1'

これを達成する方法はありますか?

4

1 に答える 1

1

警告: 私は Ruby について何も知りませんが、使用しているプログラミング言語とは関係のない問題を抱えています。

Hyphen-minus(-) U+002D -に変換する必要はありませんsimple hyphen/minus (ascii 45)。それらは同じものです。

あなたは、データベースのエンコーディングが であると考えていますlatin1。「私のデータは ISO-8859-1 aka latin1 でエンコードされています」という文は、「小切手はメールにあります」と「もちろん、朝になってもあなたを愛しています」とともにそこにあります。1 文字あたり 1 バイトのエンコーディングであることがわかります。

「フェッチされた文字列」が「データベースから抽出されたバイト文字列」を意味すると仮定することは、別名chardetを報告するのに非常に正しい可能性が非常に高いですが、これは偶然かもしれません.windows-1252cp1252chardet

latin1(a) これらの Unicode 文字は、または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 ―

それらが入力またはデータベースに表示される可能性があるという印象を与えるものは何ですか?

(b) これらの Unicode 文字はデコードできますが、またはにはデコードできcp1252ません。latin1ascii

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

これら (おそらく EN DASH) は、ASCII ハイフン/ダッシュに変換するために本当に必要なものです。chardetとして報告された文字列には何がありましたwindows-1252か?

(c) これはcp1252andにデコードできますが、 にはデコードできlatin1ませんascii:

Soft Hyphen   U+00AD  ­

文字列に非 ASCII 文字が含まれている場合、何らかの「無視」または「置換」オプションを使用しない限り、 (iconvまたはその他の方法を使用して) 変換しようとしても失敗します。なぜそうしようとしているのですか?ascii?

于 2010-10-09T23:07:41.287 に答える