3

私の会社には、サードパーティのWebメールシステム上に構築されたCRM製品があります。基盤となるデータベースを使用し、独自のデータベースを追加して拡張しました。当社の製品を使用するだけでなく、クライアントはウェブメールシステムに直接ログインすることができます。

ウェブメールデータベースはSQL_Latin1_General_CP1_CI_ASでエンコードされており、連絡先名はnvarcharではなくvarchar列に保存されます。

当社の製品とWebメール製品の両方がContent-Typeのページを提供します:text / html charset = utf-8

クライアントが「Céline」という名でWebメール(サードパーティシステム)に連絡先を作成すると、最終的に「Céline」としてデータベースに保存されます。これは、ウェブメールがデータベースに保存する前に、最初にデータをutf-8からlatin-1に変換しているように見えるためです。utf-8文字'é'は2バイトとして格納され、latin-1では2文字として解釈されます:"é"

ただし、データを取得してWebメールに表示すると、「Céline」として正しく表示されます。

問題は次のとおりです。CRMシステムから連絡先を読み書きするときに、名を「Céline」に設定すると、最初にlatin-1「Céline」に変換されるのではなく、「Céline」として保存されます。

逆に、WebメールでCélineを作成すると、latin-1からutf-8に変換されないため、CRM製品ではCélineとして表示されます。

当社の製品はフランスで国際化されており、かなりの数か月間生産されているため、両方のエンコード方法でシステムにかなりの量のデータがあります。

以下を使用して、latin-1からutf-8に変換できます。

var bytes = Encoding.GetEncoding("iso-8859-1").GetBytes(Convert.ToString(obj))
string fix2 = Encoding.UTF8.GetString(bytes).Trim(); //from iso-8859-1 (latin-1) to utf-8

ただし、これは、データが保存される前にlatin-1に正しく変換された場合にのみ機能します。したがって、私が本当に必要としているのは、レコード内のデータがutf-8でエンコードされた文字列であるかlatin-1でエンコードされた文字列であるかを判別する方法です。

または、今後は、ウェブメールの動作を模倣し、データベースへのすべての書き込み操作を最初にutf-8からlatin-1に変換し、すべての読み取り操作をlatin-1からutf-8に変換する方法が必要です。

何か案は?追加情報/説明が必要な場合はお知らせください。

4

1 に答える 1

1

いくつかの説明。文字エンコード間でバイトストリームを変換すること(これによりバイトが変更されます)と、異なる文字エンコードを使用してバイトストリームを解釈すること(これはバイトを変更せず、表示を変えるだけです)には違いがあります。UTF-8Webメールアプリケーションは、データベースに向かう途中で文字を変換しませんが、バイトストリームを(誤って)再解釈します。

正しくエンコードされていない文字を検出することは可能ですか?

理論的には、違います。ISO-8859-1完全に有効であると解釈される文字。実際には、例のÃなどのあまり一般的ではない文字の検索を手作りして、矛盾を見つけることができます。

ウェブメールが行っていることを模倣する方法が必要です

C#の文字列をからに再解釈するにUTF-8ISO-8859-1、次の行を使用できます(データベースから戻る途中で反対のことを実行することを忘れないでください)

Encoding.GetEncoding("iso-8859-1").GetString(Encoding.UTF8.getBytes("Some text"))
于 2012-05-02T20:31:43.510 に答える