1

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

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

DILORIO 的汽车车身店

请注意,它与以下之间的撇号有所不同。

DILORIO 的汽车车身店

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

该名称存储在 DB 表中,如下所示:

DILORIO 的汽车车身店

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

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

在此处输入图像描述

这是 mysql 中字段的数据库排序规则及其外观: 在此处输入图像描述 在此处输入图像描述

理想情况下,我想删除数据库中所有损坏的数据并将 PHP 连接修复到 unicode。但是在这一点上,以与 PHP 相同的方式阅读已经存在的内容会很好。

我还尝试了所有不同组合的编码转换,但这里也没有运气: 在此处输入图像描述

4

1 回答 1

1

该文本是用Windows-1252编码的,而不是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"
于 2022-01-16T16:04:15.120 回答