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

时间:2012-05-02 20:09:00

标签: .net sql-server encoding utf-8

我的公司有一个基于第三方网络邮件系统构建的CRM产品。我们使用他们的底层数据库,并使用我们自己的其他数据库进行扩展。除了使用我们的产品外,客户还可以直接登录Webmail系统。

网络邮件数据库是SQL_Latin1_General_CP1_CI_AS编码,联系人名称存储在varchar列中,而不是nvarchar。

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

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

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

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

反之亦然,如果您在网络邮件中创建Céline,它会在我们的CRM产品中显示为Céline,因为它没有从latin-1转换为utf-8

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

我可以使用:

从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编码字符串的方法。

或者,继续前进,我需要一种模仿webmail正在做的事情的方法,并使对数据库的所有写入操作首先从utf-8转换为latin-1,并且所有读取操作从latin-1转换为utf- 8。

有什么想法吗?如果您需要其他信息/说明,请与我们联系。

1 个答案:

答案 0 :(得分:1)

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

  

是否可以检测编码错误的字符?

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

  

我需要一种模仿网络邮件正在做什么的方法

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

Encoding.GetEncoding("iso-8859-1").GetString(Encoding.UTF8.getBytes("Some text"))