मेरे पास एक एसक्यूएल-सर्वर 2010 डेटाबेस दो अनुप्रयोगों के बीच साझा किया गया है। एक एप्लिकेशन जिसका हम नियंत्रण करते हैं, और दूसरा एप्लिकेशन एक तृतीय-पक्ष ऐप है जिसने डेटाबेस को पहले स्थान पर बनाया है। हमारा ऐप तीसरे पक्ष के वेबमेल ऐप के शीर्ष पर बनाया गया एक सीआरएम है।खराब यूटीएफ -8 एन्कोडिंग का पता लगाना: खराब पात्रों की सूची स्नीफ करने के लिए?
डेटाबेस में वर्चर्स कॉलम हैं और लैटिन -1 एन्कोडेड है। तृतीय-पक्ष ऐप php में लिखा गया है और डेटा को सही ढंग से एन्कोड करने की परवाह नहीं करता है, इसलिए यह वर्चर्स कॉलम में utf-8 एन्कोडेड बाइट्स को सामान देता है, जहां उन्हें लैटिन -1 के रूप में व्याख्या किया जाता है और कचरा जैसा दिखता है।
हमारा सीआरएम ऐप नेट में लिखा गया है, जो स्वचालित रूप से पता लगाता है कि डेटाबेस संयोजन स्ट्रिंग में स्ट्रिंग के एन्कोडिंग को अलग करता है, इसलिए जब नेट डेटाबेस को लिखता है, तो यह डेटाबेस एन्कोडिंग से मेल खाने के लिए बाइट्स को परिवर्तित करता है।
तो ... हमारे ऐप से डीबी को लिखा गया डेटा डीबी में सही दिखता है, लेकिन तीसरे पक्ष के ऐप से डेटा नहीं होता है।
जब हमारे एप्लिकेशन लिखते प्रथम = Céline, जब वेबमेल एप्लिकेशन प्रथम = Céline लिखते Céline
के रूप में DB में संग्रहीत किया जाता है यह CA © लाइन
हमारे सीआरएम अनुप्रयोग की जरूरत के रूप में DB में संग्रहीत किया जाता है किसी भी सिस्टम में बनाए गए संपर्कों को प्रदर्शित करने के लिए। तो मैं एक एन्कोडिंगस्निफर क्लास लिख रहा हूं जो ध्वजांकित वर्णों को देखता है जो इसकी खराब एन्कोडेड स्ट्रिंग को इंगित करता है और उन्हें परिवर्तित करता है।
वर्तमान में मेरे पास है:
private static string[] _flaggedChars = new string[] { "é" };
जो Céline के रूप में सीए © लाइन प्रदर्शित करने के लिए अच्छा काम करता है, लेकिन मैं सूची में शामिल करने की जरूरत है।
क्या किसी को भी संसाधनों के बारे में पता है कि सभी संभावित तरीकों को प्राप्त करने के लिए utf-8 विशेष वर्णों को आईएसओ -885 9 -1 के रूप में व्याख्या किया जा सकता है?
धन्यवाद
स्पष्टीकरण: के बाद से मैं नेट में काम कर रहा हूँ। स्ट्रिंग, डेटाबेस से स्मृति में लोड होने पर, यूनिकोड यूटीएफ -16 में परिवर्तित हो जाती है। तो, भले ही इसे डेटाबेस में सही ढंग से एन्कोड किया गया हो। इसे अब यूटीएफ 16 बाइट्स के रूप में दर्शाया गया है। मुझे यूटीएफ -16 बाइट्स का विश्लेषण करने में सक्षम होना चाहिए, और यह निर्धारित करना है कि क्या वे आईएसएफ -8 बाइट्स को आईएसओ -885 9 -1 डेटाबेस में भरने के कारण खराब हो गए हैं .... मिट्टी के रूप में स्पष्ट है?
यहां मेरे पास अभी तक है। इसने सबसे गलत गलतियों के प्रदर्शन को साफ कर दिया है, लेकिन मुझे अभी भी ए के साथ परेशानी हो रही है: उदाहरण के लिए एरिक वेबमेल द्वारा डीबी में संग्रहीत किया जाता है, लेकिन खराब एन्कोडिंग का पता लगाने और इसे वापस बदलने के बाद, यह के रूप में प्रदर्शित होता है ? 'ई 195 में बदला जा रहा है: रिक लिए उपयोगकर्ता के पास 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;
}
तो है Ã ', 8240' ‰ '
यह UTF-8 में डीबी एन्कोडिंग बदलने के लिए एक विकल्प है, सबसे आसान समाधान की तरह लगता है के बाद से वहाँ यूनिकोड और लैटिन -1 –
परीक्षण के बीच नहीं एक 1 के लिए 1 रूपांतरण स्ट्रिंग वैध UTF है कि क्या है -8 एक बेहतर दृष्टिकोण हो सकता है। (शायद कम महंगी भी।) – Mat
@ मैट, यह अनिवार्य रूप से मैं क्या करने की कोशिश कर रहा हूं, मुझे नहीं पता कि कैसे। और खराब चरित्र स्नीफिंग दृष्टिकोण सबसे अच्छा था जिसके साथ मैं आया था। वैध यूटीएफ -8 के लिए परीक्षण के बारे में आप कैसे जाएंगे? – Michael