快速背景:我继承了一个包含英语和阿拉伯语文本组合的大型 sql 转储文件,并且(我认为)它最初是使用“latin1”导出的。在导入文件之前,我将所有出现的“latin1”更改为“utf8”。阿拉伯语文本在 phpmyadmin 中没有正确显示(我想这是正常的),但是当我将文本加载到具有以下内容的网页时……
<meta http-equiv='Content-Type' content='text/html; charset=windows-1256'/>
…一切看起来都很好,阿拉伯文字显示完美。
问题:我的客户真的非常挑剔,不想改变他的……
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
…相当于“Windows-1256”。我不认为这会是个问题,但是当我将字符集值更改为“UTF-8”时,所有阿拉伯字符都显示为带问号的菱形。 UTF-8 不应该正确显示阿拉伯语文本吗?
以下是有关我的数据库配置的一些注意事项:
- 数据库字符集是 ‘utf8’
- 数据库连接排序规则是 ‘utf8_general_ci’
- 所有数据库、表格和适用字段都已整理为 ‘utf8_general_ci’
我一直在搜索堆栈溢出和其他论坛以查找与我的问题相关的任何内容。我发现了类似的问题,但似乎没有一种解决方案适合我的具体情况。希望有人能帮忙!
原文由 ThisLanham 发布,翻译遵循 CC BY-SA 4.0 许可协议
如果文档在声明为 windows-1256 编码时看起来正确,那么它很可能 是 windows-1256 编码的。所以它显然不是使用 latin1 导出的——这是不可能的,因为 latin1 没有阿拉伯字母。
如果这只是关于单个文件,那么最简单的方法是使用例如 Notepad++ 将其从 windows-1256 编码转换为 utf-8 编码。 (打开其中的文件,通过文件格式菜单将编码更改为阿拉伯语,windows-1256。然后在文件格式菜单中选择转换为 UTF-8,然后执行文件 → 保存。)
Windows-1256 和 UTF-8 是完全不同的编码,因此如果您将 windows-1256 数据声明为 UTF-8,数据就会变得一团糟,反之亦然。只有 ASCII 字符(例如英文字母)在两种编码中具有相同的表示形式。