我的公司有一个建立在第三方网络邮件系统之上的 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。
有任何想法吗?如果您需要更多信息/说明,请告诉我。