私の会社には、サードパーティの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に変換する方法が必要です。
何か案は?追加情報/説明が必要な場合はお知らせください。