2 つのアプリケーション間で共有される sql-server 2010 データベースがあります。1 つのアプリケーションは私たちが管理しており、もう 1 つのアプリケーションは最初にデータベースを作成したサードパーティのアプリです。私たちのアプリは、サードパーティのウェブメール アプリの上に構築された CRM です。
データベースには varchar 列が含まれており、latin-1 でエンコードされています。サードパーティのアプリは php で記述されており、データを正しくエンコードすることを気にしないため、utf-8 でエンコードされたバイトを varchar 列に詰め込み、そこでラテン 1 として解釈され、ゴミのように見えます。
当社の CRM アプリは .Net で作成されており、データベースの照合順序がメモリ内の文字列のエンコードと異なることを自動的に検出します。そのため、.Net がデータベースに書き込むと、データベースのエンコードに一致するようにバイトが変換されます。
そのため...アプリからデータベースに書き込まれたデータはデータベースで正しく見えますが、サードパーティのアプリからのデータはそうではありません。
アプリがFirstName = Célineを書き込むと、データベースにCélineとして保存されます
ウェブメール アプリが FirstName = Céline と書き込むと、DB に Céline として保存されます。
CRM アプリは、いずれかのシステムで作成された連絡先を表示する必要があります。そのため、エンコードが不十分な文字列であることを示すフラグ付き文字を探して変換する EncodingSniffer クラスを作成しています。
現在私は持っています:
プライベート静的文字列[] _flagedChars = 新しい文字列[] { 「エ」 };
これは Céline を Céline として表示するのに最適ですが、リストに追加する必要があります。
utf-8 特殊文字が iso-8859-1 として解釈される可能性のあるすべての方法を取得するためのリソースを知っている人はいますか?
ありがとう
明確化: 私は.Netで働いているので。文字列は、データベースからメモリにロードされると、Unicode UTF-16 に変換されます。したがって、データベースで正しくエンコードされているかどうかに関係なく。現在は UTF16 バイトとして表されます。これらのUTF-16バイトを分析し、utf-8バイトがiso-8859-1データベースに詰め込まれているためにそれらが台無しになっているかどうかを判断できる必要があります....泥のように明確ですか?
これが私がこれまでに持っているものです。ほとんどの誤ってエンコードされた文字の表示はクリーンアップされましたが、たとえば É にはまだ問題があります。Éric は Web メールによって Éric としてデータベースに保存されますが、不適切なエンコードを検出して元に戻すと、�? として表示されます。 ric 2500 の連絡先を持っているユーザーを見ると、そのうちの数百はエンコードの問題があり、正しく表示されていないのは É だけです...
public static Regex CreateRegex()
{
string specials = "ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö";
List<string> flags = new List<string>();
foreach (char c in specials)
{
string interpretedAsLatin1 = Encoding.GetEncoding("iso-8859-1").GetString(Encoding.UTF8.GetBytes(c.ToString())).Trim();//take the specials, treat them as utf-8, interpret them as latin-1
if (interpretedAsLatin1.Length > 0)//utf-8 chars made up of 2 bytes, interpreted as two single byte latin-1 chars.
flags.Add(interpretedAsLatin1);
}
string regex = string.Empty;
foreach (string s in flags)
{
if (regex.Length > 0)
regex += '|';
regex += s;
}
return new Regex("(" + regex + ")");
}
public static string CheckUTF(string data)
{
Match match = CreateRegex().Match(data);
if (match.Success)
return Encoding.UTF8.GetString(Encoding.GetEncoding("iso-8859-1").GetBytes(data));//from iso-8859-1 (latin-1) to utf-8
else
return data;
}
つまり: É は 195'Ã',8240'‰' に変換されます。