2017-06-07 5 views
1

Ich arbeite in PostgreSQL-Datenbank und ich habe Textspalte, die in verschiedenen Sprachen wie Russisch, Chinesisch, Koreanisch, Englisch usw. Obwohl unsere Anwendung diese Sprachen gut behandelt, haben wir ein Problem zu behandeln Nicht-UTF-8 Zeichen.Identifizieren versteckte nicht UTF8 codierte Zeichen

Zum Beispiel, wenn Sie das Bild von Notepad ++, wo ich Encoding> Encode in UTF-8 getan habe, zeigt es alle nicht erkennbaren Zeichen.

Wir stehen jedoch vor der Herausgabe solcher Datensätze, die in Postgres nicht verarbeitet werden können. Etwas wie eine Flagge sollte auch tun, aber ich versuche etwas wie unten, aber es markiert die gültigen russischen Datensätze als auch Notepad ++ zeigt explizit die versteckten/nicht-UTF-8 Zeichen.

Notepad ++ notepad++ UTF-8

Sonderbare Sache über diese Zeichen sind, dass sie zeigen sich regelmäßig Auswahlabfrage nicht, aber wenn ich sie konvertieren zu „UTF-8“, zeigen diejenigen, die wie unten nach oben.

Datenbank enter image description here

versucht so etwas wie dieses (unter Abfrage), aber es scheint nicht, das heißt geben Sie mir die gewünschte Ausgabe zu arbeiten. Die Erwartung besteht darin, eine Markierung für solche Datensätze zu setzen, die ungültige versteckte HTML-Referenzen haben, aber nicht den gültigen Text wie den gültigen russischen Satz im Snapshot verlieren. Sollte nur solche Texte eindeutig identifizieren können.

select text, text ~ '[^[:ascii:]]', text ~ '^[\x00-\x7F]*$' 
from sample_data; 

Beispieldaten -

". Я не наркоман Это у меня всегда, когда мне афигитительно А если серьёзно, это интересно, ..."

„Ya le Dieron amor a la foto de instagram de mi #UberCALAVERITA? "

der "Executive Admininstrative Assistent in Toronto, ON für eine Gruppe"

"Сегодня валютные стратеги BMO обновили прогнозы î основным валютам на ближайшие пять кварталов (на конец периода): читать далее ..."

„Flicitations Gestion d'actifs für 6 Trophes # FundGradeA + 2016 de fonds communs de placement: "

Antwort

1

Diese Antwort könnte Ihnen helfen, Probleme zu beheben. Es hilft dir nicht direkt vorwärts in die Richtung, nach der du fragst.

Wenn Sie auf Ficlications und F \ 302 \ 202licitations schauen, sehen die Escape-Zeichen wie oktal aus, was möglicherweise eine Präsentationsauswahl Ihrer "IDE" und/oder der convert_to-Funktion ist. Von oktal ist \ 302 \ 202 0xC2 0x82, decoding as UTF-8 ergibt U + 0082. In Unicode ist dies ein Steuerzeichen, in ISO 8859-1 ist es ein Nicht-Zeichen, das könnte erklären, warum einige Renderings es unsichtbar machen oder keinen Platz einnehmen.

Jetzt sagt mir Google, dass Ficlications ist fast wie ein Französisch Wort, Félicitations. Vielleicht gibt es also einen Zeichensatz und eine Codierung, wobei é als 0x82 codiert ist. Wikipedia hilft hier-Tatsächlich gibt es: IBM850, die für einige Französisch Text verwendet wurde.

So scheint es, dass jemand den Text des Benutzers falsch behandelt hat, was zu Datenverlust führt. Die Grundregel der Textcodierung ist, dass Textbytes mit derselben Codierung gelesen werden müssen, mit der sie geschrieben wurden. Raten Sie nicht; Fragen Sie nach einem Standard, einer Spezifikation, einer Dokumentation oder einer Konvention, oder verweisen Sie darauf. Vielleicht können Sie zurückgehen und den fehlerhaften Prozess/Code finden - zumindest würde das einen zukünftigen Datenverlust verhindern.


"Umgang mit Nicht-UTF-8-Zeichen": Es gibt nicht wirklich Nicht-UTF-8-Zeichen. UTF-8 ist eine Codierung des Unicode-Zeichensatzes. Es gibt Bereiche mit Ausnahmen, aber praktisch hat Unicode alle Zeichen und UTF-8 kann sie alle codieren. Also, wenn Sie denken, dass es nicht UTF-8-Zeichen gibt, ist der Schreiber entweder nicht konform oder der Leser verwendet die falsche Kodierung.

Verwandte Themen