3

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

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

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

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

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

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

反之亦然,如果您在 webmail 中创建 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。

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

4

1 回答 1

1

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

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

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

我需要一种方法来模仿 webmail 正在做什么

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

Encoding.GetEncoding("iso-8859-1").GetString(Encoding.UTF8.getBytes("Some text"))
于 2012-05-02T20:31:43.510 回答