【问题标题】:Convert MySQL non-unicode characters in C#在 C# 中转换 MySQL 非 unicode 字符
【发布时间】:2022-01-15 21:14:09
【问题描述】:

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

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

DILORIO 的汽车店

注意它和下面的撇号有区别。

迪洛里奥的汽车店

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

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

DILORIO 的汽车车身店

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

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

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

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

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

【问题讨论】:

标签: c# php mysql unicode mysql.data


【解决方案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"

【讨论】:

  • 非常酷!但我只是好奇你是如何找出这种情况下的编码的?有没有机制或者你只是知道?
  • @AnKing 我经常看到这个“mojibake”,以至于我立刻认出了它?en.wikipedia.org/wiki/Mojibake
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-07-03
  • 1970-01-01
  • 2011-04-02
  • 2017-01-29
  • 2011-01-31
  • 1970-01-01
  • 2021-06-30
相关资源
最近更新 更多