php/mysql 中的阿拉伯语文本有时会在选择/插入语句后出现“???”,有时出现“Ùؤتا”


Arabic texts in php/mysql sometimes appear “???” and sometime appear "Ùؤتا" after select/insert statement

我有一个正在进行的项目,我需要从mysql表中获取阿拉伯语文本,并不时插入/更新它们。我在"utf8_general_ci"中有我的数据库排序规则。

起初,我在获取一些阿拉伯语数据时发现问号"???"。然后我执行了"设置字符集 utf8"。该特定问题的问号问题得到了解决,但随后其他阿拉伯语数据开始显示胡言乱语"Ùؤتا"。在项目中,我还需要从包含阿拉伯语文本的csv中获取一些数据。

以下是我在字符集执行之前和之后找到的 json 数据:

[{
  "id": 148,
  "domain": 0,
  "group_name": "ATX ??????????",
  "score": 0,
  "player_name": "لاعب واحد",
  "created_at": "2015-10-26 13:01:23"
},
{
  "id": 148,
  "domain": 0,
  "group_name": "???? ???????",
  "score": 1,
  "player_name": "اثنين من لاعب",
  "created_at": "2015-10-26 12:59:57"
}]
// ---------------------------------------
// After executing "SET CHARACTER SET utf8"
// ---------------------------------------  

[{
  "id": 148,
  "domain": 0,
  "group_name": "ATX توكوروزاوا",
  "score": 0,
  "player_name": "مؤتا",
  "created_at": "2015-10-26 13:01:23"
},
{
  "user_id": 148,
  "domain": 0,
  "group_name": "لندن دينيموز",
  "score": 1,
  "player_name": "كابوا",
  "created_at": "2015-10-26 12:59:57"
}]

谁能告诉我这里出了什么问题?我正在尝试解决此问题,但找不到任何解决方案。

مؤتامؤتا的Mojibake:

  • 客户端中的字节以 utf8(良好(正确编码。
  • 您可能默认连接了SET NAMES latin1(或set_charset('latin1')或...(。 (应该是utf8的。
  • 表中的列可能CHARACTER SET utf8也可能没有,但应该是这样。

لاعب可能是"双重编码"——避免这条路。

"ATX ??????????" --

UTF8 需要在大约 4 个地方建立。

  • 数据库中的列 -- 使用 SHOW CREATE TABLE 验证它们是显式设置为 utf8 还是表定义中的缺省值。 (仅更改数据库默认值是不够的。
  • 客户端和服务器之间的连接。 请参阅SET NAMES utf8
  • 您拥有的字节数。 (情况可能就是这样。
  • 如果要在网页中显示文本,请检查 <meta> 标记。

另请参阅UTF-8

看起来您的数据库中有 2 种不同字符编码的文本,utf8 和我猜的 latin1。您必须决定绝对使用哪个(我建议使用 utf8(并更新其他编码中的文本以匹配。

尝试这样的事情来测试正确的编码:

SELECT group_name, CONVERT(player_name USING utf8) FROM your_table;

如果输出正确,则可以使用以下方法永久更正数据:

UPDATE your_table SET player_name = CONVERT(player_name USING utf8);

见 https://dev.mysql.com/doc/refman/5.0/en/charset-convert.html