在 C# 中转换 MySQL 个非 unicode 字符

Convert MySQL non-unicode characters in C#

我有一个 PHP 应用程序当前以非常规格式将数据存储在 MySQL table 中(我假设这是因为它使用的是非 unicode mysql连接)。

例如,这是 PHP 应用中显示的客户名称之一 UI:

DILORIO’S AUTO BODY SHOP

注意它和后面的撇号不同。

DILORIO'S AUTO BODY SHOP

后者使用标准的拉丁撇号来反对 unicode(我猜)风格。

此名称存储在数据库 table 中,如下所示:

DILORIO’S AUTO BODY SHOP

当它从数据库中提取并显示在 UI 中时,一切看起来都是正确的,但是当我开始使用 MYSQL.Data C# 连接器提取相同数据时出现了问题。

起初我认为我应该能够直接将值字节数组转换为 latin1(我假设这是 PHP 的默认值),但是现有的 none编码似乎让我得到了我想要的结果,这就是我得到的:

这是 mysql 中字段的数据库排序规则及其外观:

理想情况下,我想清除数据库中所有损坏的数据并修复 PHP 与 unicode 的连接。但在这一点上,如果能像 PHP 那样阅读已经存在的内容就好了。

我还尝试了所有不同组合的编码转换,但这里也没有运气:

文本使用 Windows-1252, not Latin1 编码,这就是为什么您在上面尝试解码失败的原因。一旦将字符串转换为 Windows-1252 字节,然后使用 UTF-8 对其进行解码,您应该具有正确的值:

// note: on .NET 6.0, add 'System.Text.Encoding.CodePages' and call this line of code:
// Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);

var windows1252 = Encoding.GetEncoding(1252);
var utf8Bytes = windows1252.GetBytes("DILORIO’S AUTO BODY SHOP");
var correct = Encoding.UTF8.GetString(utf8Bytes);
// correct == "DILORIO’S AUTO BODY SHOP"