5 Stimmen

verschiedene Arten von utf-Bindestrichen in Ruby 1.8.7 in Angriff nehmen

Wir haben verschiedene Arten von Bindestrichen (in einigen Texten) in der Datenbank gespeichert. Bevor ich sie mit einem vom Benutzer eingegebenen Text vergleiche, muss ich jede Art von Bindestrichen zu einem einfachen Bindestrich/Minus (ascii 45) normalisieren.

Die möglichen Bindestriche, die wir umwandeln müssen, sind:

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 ―

Diese müssen alle mit gsub in Bindestrich-minus(-) umgewandelt werden. Ich habe verwendet CharDet gem, um den Zeichenkodierungstyp der abgerufenen Zeichenfolge zu erkennen. Es wird angezeigt Fenster-1252 . Ich habe versucht Iconv um die Kodierung in ascii zu konvertieren. Aber es wird eine Ausnahme geworfen Iconv::IllegalSequence .

ruby -v => ruby 1.8.7 (2009-06-12 patchlevel 174) [i686-darwin9.8.0]
rails -v => Rails 2.3.5
mysql-Kodierung => 'latin1'

Haben Sie eine Idee, wie man das erreichen kann?

1voto

John Machin Punkte 78125

Achtung: Ich weiß nichts über Ruby, aber Sie haben Probleme, die nichts mit der Programmiersprache zu tun haben, die Sie verwenden.

Sie brauchen nicht zu konvertieren Hyphen-minus(-) U+002D - a simple hyphen/minus (ascii 45) ; sie sind dasselbe.

Sie glauben, dass die Datenbankkodierung latin1 . Die Aussage "Meine Daten sind in ISO-8859-1 alias latin1 kodiert" steht in einer Reihe mit "Der Scheck ist in der Post" und "Natürlich liebe ich dich auch noch am Morgen". Sie besagt lediglich, dass es sich um eine Ein-Byte-pro-Zeichen-Kodierung handelt.

Unter der Annahme, dass "abgerufener String" "aus der Datenbank extrahierter Byte-String" bedeutet, chardet ist sehr wahrscheinlich ganz richtig in der Berichterstattung windows-1252 alias cp1252 -- dies kann jedoch ein Zufall sein, da chardet scheint dies manchmal als Standard zu melden, wenn andere Möglichkeiten ausgeschöpft sind.

(a) Diese Unicode-Zeichen können nicht dekodiert werden in latin1 o cp1252 o 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 ―

Was gibt Ihnen den Eindruck, dass sie möglicherweise in der Eingabe oder in der Datenbank auftauchen könnten?

(b) Diese Unicode-Zeichen können dekodiert werden in cp1252 でなくて latin1 o ascii :

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

Diese (höchstwahrscheinlich die EN DASH) müssen Sie wirklich in einen Bindestrich/Bindestrich in ASCII umwandeln. Was war in der Zeichenkette, die chardet berichtet als windows-1252 ?

(c) Dies kann entschlüsselt werden in cp1252 y latin1 でなくて ascii :

Soft Hyphen   U+00AD  ­

Wenn eine Zeichenkette Nicht-ASCII-Zeichen enthält, wird jeder Versuch (mit iconv oder eine andere Methode), um sie in ascii wird fehlschlagen, es sei denn, Sie verwenden eine Art "Ignorieren" oder "Ersetzen durch ? Option". Warum versuchen Sie das zu tun?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X