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

.net 如何检测和解析编码错误的Varchar数据?,.net,sql-server,encoding,utf-8,.net,Sql Server,Encoding,Utf 8,我的公司有一个建立在第三方网络邮件系统之上的CRM产品。我们使用他们的底层数据库,并用我们自己的其他数据库对其进行了扩展。除了使用我们的产品,客户还可以直接登录到webmail系统 webmail数据库是SQL\u Latin1\u General\u CP1\u CI\u编码的数据库,联系人姓名存储在varchar列中,而不是nvarchar列中 我们的产品和webmail产品都提供内容类型为text/html charset=utf-8的页面 如果客户在webmail(第三方系统)中创建了一

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

webmail数据库是SQL\u Latin1\u General\u CP1\u CI\u编码的数据库,联系人姓名存储在varchar列中,而不是nvarchar列中

我们的产品和webmail产品都提供内容类型为text/html charset=utf-8的页面

如果客户在webmail(第三方系统)中创建了一个名为“Céline”的联系人,则该联系人最终将作为“CÃline”存储在数据库中。这是因为webmail似乎首先将数据从utf-8转换为拉丁语-1,然后再将其存储到数据库中。utf-8字符“é”存储为两个字节,在拉丁语-1中被解释为两个字符:“é”

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

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

反之亦然,如果您在webmail中创建Céline,它在我们的CRM产品中显示为Céline,因为它没有从拉丁语-1转换为utf-8

我们的产品是法国国际化的,已经投入生产好几个月了,所以系统中有相当多的数据,采用两种编码方法

我可以使用以下方法将拉丁语-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
但这只有在数据在存储之前正确地转换为拉丁语-1时才能起作用。所以我真正需要的是一种确定记录中的数据是utf-8编码字符串还是拉丁-1编码字符串的方法

或者,向前看,我需要一种方法来模拟webmail所做的工作,并使所有对数据库的写入操作首先从utf-8转换为拉丁语-1,所有读取操作都从拉丁语-1转换为utf-8


有什么想法吗?如果您需要更多信息/澄清,请告诉我。

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

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

理论上,不是。被解释为
ISO-8859-1
的字符完全有效。实际上,您可以手工搜索不太常见的字符,如示例中的Ã,并能够找到不一致之处

我需要一种模仿webmail的方式

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


谢谢你的澄清。我想我理解了如果webmail将一个应解释为utf8的字节[]传递给latin-1数据库,它将如何在数据库中不正确地显示,它正在这样做。但webmail似乎在阅读端解决了这个问题,因为当查看存储为Céline的联系人时,它在浏览器中显示为Céline。那么,您是否认为webmail应用程序错误地忘记了在写入db之前进行转换,但在读取端,它正在进行返回utf8的转换?因此,由于我们可以控制我们的webmail数据库,理想情况下,我只需更改数据库上的编码,但我担心的是,webmail会正确存储数据,但由于我们无法控制源代码,它仍会尝试转换回utf-8,期望它被编码为拉丁语-1,而实际上不是。由于webmail应用程序既不进行写转换,也不进行读转换,字符将在浏览器中正确显示,应用程序并不关心它是否在内部曲解字符。如果您同意使用ISO-88590-1,那么最好的选择可能是按照@j3duardogarcin4的建议修改webmail应用程序提供的页面上的字符编码(如果可能,这还需要重新编码当前数据库)。要在数据库中存储UTF-8,您需要使用NVARCHAR数据类型,这可能对你的原因没有任何帮助,因为webmail应用程序认为它正在插入ISO-8859-1,这可能会导致数据库中的转换…好的,我知道了,所以webmail应用程序不关心读或写时的编码,iso-8859-1存储数据在浏览器中显示为正确的utf-8数据的原因是服务器指示其utf-8?反之亦然,.Net以其自动的智慧,很可能是在自动地为我们进行数据库编码的转换?
Encoding.GetEncoding("iso-8859-1").GetString(Encoding.UTF8.getBytes("Some text"))