如何检测和解决错误编码的Varchar数据?

我的公司有一个建立在第三方网络邮件系统之上的CRM产品。 我们使用他们的底层数据库,并用我们自己的其他数据库扩展它。 除了使用我们的产品,客户还可以直接登录到webmail系统。

Webmail数据库是SQL_Latin1_General_CP1_CI_AS编码的,联系人名称存储在varchar列中,而不是nvarchar。

我们的产品和webmail产品都提供Content-Type:text / html charset = utf-8的页面

如果客户在名为“Céline”的网络邮件(第三方系统)中创建联系人,它最终会以“Céline”的形式存储在数据库中。 这是因为webmail似乎首先将数据从utf-8转换为latin-1,然后将其存储在数据库中。 utf-8 char'é'存储为两个字节,在拉丁文中被解释为两个字符:“Ô

但是,当数据检索并显示在网络邮件中时,它会正确显示为'Céline'

问题是:当从我们的CRM系统读取/写入联系人时,如果您将第一个名称设置为'Céline',则将其存储为'Céline',而不是先转换为latin-1'Céline'

反之亦然,如果您在Webmail中创建Céline,则它会在我们的CRM产品中显示为Céline,因为它未从latin-1转换为utf-8

我们的产品具有法国国际化的特点,已经投入生产了几个月,因此系统中有相当多的数据都采用这两种编码方法。

我可以使用以下命令从拉丁文转换为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

但是,这只有在数据在存储之前正确转换为拉丁文-1才有效。 所以我真正需要的是确定记录中的数据是utf-8编码的字符串还是拉丁字母编码的字符串。

或者,继续前进,我需要一种方法来模拟webmail正在做什么,并且首先将数据库的所有写操作从utf-8转换为latin-1,并且所有读操作都从latin-1转换为utf-8。

有任何想法吗? 如果您需要更多信息/说明,请告诉我。


一些澄清。 在字符编码之间转换字节流(这将修改字节)和使用不同字符编码解释字节流(这不会修改字节,只是以不同方式显示)之间存在差异。 您的Webmail应用程序不会将数据库中的UTF-8字符转换为数据库,而是(错误地)重新解释字节流。

是否有可能检测到错误编码的字符?

理论上,没有。 字符,解释为ISO-8859-1是完全有效的。 在实践中,你可以在你的例子中手工搜索不常见的字符,如Ã,并能找到不一致的地方。

我需要一种模仿网络邮件的方式

要将C#中的字符串从UTF-8重新解释为ISO-8859-1您可以使用以下行(请记得在从数据库返回的路上执行相反的操作)

Encoding.GetEncoding("iso-8859-1").GetString(Encoding.UTF8.getBytes("Some text"))
链接地址: http://www.djcxy.com/p/60713.html

上一篇: How to Detect and Resolve Incorrectly Encoded Varchar Data?

下一篇: How to make an XmlDocument respect HTML escape sequences