2013-02-20 7 views
13

これは、エンコードされていると思われるようなMySQLデータベースからのエクスポートを与えられています。 & uuml;など、同じ文字を表す問題のある文字は、üÃです。いくつかの整合性をファイルに戻し、すべてを正しいラテン文字にすることは私の仕事です。 úおよびóüとƒのような特殊文字をC#の元のラテンアルファベットの対応に戻します

私が扱っていた文字列の並べ替えの例では、方法はあります

50 Tattoo Desinfektionsl ö sungst ü cher f ü r Fl ä chen 
50 Tattoo Desinfektionsl ö sungst ü cher f ü r Fl ä chen 

と同じである必要があります

Flächen

DesinfektionslösungstücherfürですC#/ .Net 4.5で利用可能で、üÃのようなものをうまく再エンコードすることができますo UTF-8

これ以外の方法はお勧めできますか?

上記の例の段落文字も実際の段落文字または他の文字の組み合わせの一部ですか?

下記の検索と置換が必要な場合にルックアップテーブルを作成しましたが、どのように完全であるかはわかりません。

É -> É 
“ -> " 
†-> " 
Ç -> Ç 
à -> à 
é, 'é 
à -> À 
ú -> ú 
• -> - 
Ø -> Ø 
õ -> õ 
í -> í 
â -> â 
ã -> ã 
ê -> ê 
á -> á 
é -> é 
ó -> ó 
– -> – 
ç -> ç 
ª -> ª 
º -> º 
à -> à 
+5

Pedantryのポイント:「ü¼」と「ƒƒ」は「特殊文字」ではなく、** [Mojibake](https://en.wikipedia.org/wiki/Mojibake)**です。 – Boann

+0

@Boann ped away ...面白い –

+0

あなたの投稿が多少誤解を招いています。データを修復した後、私は 'DesinfektionslösungstücherfürFlächen'を得ました。これは正しいと思われますが、期待した結果にスペースがあります。 – Esailija

答えて

19

まず、データが間違ったエンコードを使用してデコードされているため、一部の文字は復元できない可能性があります。 8ビットエンコーディングを使用して間違ってデコードされたUTF-8データのようです。

このようなデータを復元する方法はありません。通常の方法ではないからです。すでにデータが破損しているため、データをデコードする信頼できる方法はありません。

byte[] data = Encoding.Default.GetBytes(input); 
string output = Encoding.UTF8.GetString(data); 

Encoding.Defaultは、お使いのシステムの現在のANSIエンコーディングを使用しています。あなたが試すことができますどのような

は、周りだけで、他の方法をデータをエンコードし、再び間違ったエンコーディングを使用して、それをデコードすることです。いくつかの異なるエンコーディングを試して、どちらが最良の結果をもたらすかを見ることができます。

+0

ありがとうございます、私はあなたの理論は、データが回復不能であるかもしれないと思う正しいことがあります。私はそのように紐を壊してしまった... 50 タトゥーは仏教徒であり、仏教徒である---と--- 50タトゥーDesinfektionslösungstücher für Flächen。だから私はどこに表示されるべきか知っているが、まだ変換できない。 –

+0

あなたのコードと@pawlakpppの結果を合わせると、あなたのおかげで問題は解決した。 –

3

UTF-8として読んだのはおそらくwindows-1252でエンコードされた文字列です。

Guffaが述べたように、データは壊れています。

バイトに見てみましょう:
ö - >窓-1252でUTF8

でC3B6 C3 - >Ã B6 - >

¶のでö - >ö

何これらすべての "ƒÂ" について:

ƒ - > 83 Â - > C2

誠実私は彼らがなぜ登場するのか分からないが、あなたはGuffaが言及したようにそれらを消していくつかの変換を行うことができる。幸運

+0

ありがとう、私は自分自身と同じ行の調査を続けており、 "ƒÂ"を削除しています。データの再エクスポートによってそれらが削除され、A-hatsが良好なA-tildesに変換された場合、ここに示すように明確な変換が行われているように見えます。http://www.i18nqa.com/debug/utf8-debug .html –

11

データは、割り当てられていないスロットが5つあるWindows-1252エンコーディングのために部分的にしか回復できません。 Windows-1252の一部の修正では、制御 文字でこれらを埋めますが、それらはStackoverflowの投稿にはなりません。 Windows-1252を使用した場合は、コピーペーストの隠し制御文字を で失わない限り、完全に回復できます。

通常は無視されるか、通常はコピーモードでスペースに変わりますが、バイトを直接扱うときは問題ありません。

この文字列が経験してきたmisencoding虐待は次のとおりです。ここでは、

UTF-8 -> Windows-1252 -> UTF-8 -> Windows-1252 

回復するには例です。ここで

String a = "Desinfektionslösungstücher für Flächen"; 
Encoding utf8 = Encoding.GetEncoding(65001); 
Encoding win1252 = Encoding.GetEncoding(1252); 

string result = utf8.GetString(win1252.GetBytes(utf8.GetString(win1252.GetBytes(a)))); 

Console.WriteLine(result); 
//Desinfektionslösungstücher für Flächen 
+0

ありがとう、私はそのアプローチを試してみます。 –

0

私はこのchar問題で以前に悩まされてきました。 解決策:

My。(cs)htmlファイルはUTF-8でした。私はUTF-8Y(BOM付きのUTF-8)に変換しました。

関連する問題