首页 > 解决方案 > 如何用 PHP 解码 MySQL 文本?

问题描述

在这个例子中我如何编码来自 MySQL 的文本?

这是文本在 MySQL 中的样子utf8mb4_unicode_ci: $text = 'Wiesław';

到目前为止我已经尝试过:

header("Content-Type: text/html; charset=ISO-8859-1");

echo htmlentities($text);
echo '</br>';
echo html_entity_decode($text);
echo '</br>';
echo htmlspecialchars_decode($text);
echo '</br>';
echo htmlspecialchars_decode($text, ENT_NOQUOTES);
echo '</br>';
echo utf8_encode($text);
echo '</br>';
echo utf8_decode($text);
echo '</br>';
echo mb_convert_encoding($text, 'ISO-8859-1', 'UTF-8');
echo '</br>';
echo iconv('UTF-8', 'ISO-8859-1', $text);
echo '</br>';
echo mb_convert_encoding($text, 'UTF-8', 'ISO-8859-1');

结果:

Wies³aw
Wies³aw
Wies³aw
Wies³aw
Wies³aw
Wies?aw
Wies?aw

Wies³aw

期待:

维斯瓦夫

标签: phpmysqlencodingcharacter-encoding

解决方案


Grrr .. 不要使用任何这些功能。相反,正确配置 MySQL。

好: utf8mb4_unicode_ci-- 那是一个“排序规则”;它意味着CHARACTER SET utf8mb4.

  • 在客户端中有UTF-8字符。(显然,你这样做是因为你有一个 stoke-l)。
  • 告诉 MySQL 客户端正在使用utf8mb4. 最好在建立连接时执行此操作。PHP 有mysqliPDO. 每个细节:http: //mysql.rjweb.org/doc.php/charcoll#php
  • 将列(以及可选的表和数据库)声明为CHARACTER SET utf8mb4. 让我们看看SHOW CREATE TABLE现在是否可以。

如果这样做之后,你得到

Wiesław  -- Mojibake
Wies?aw   -- question mark
Wies      -- truncation
Wies�aw   -- black diamond

然后用UTF-8字符去麻烦;我看到的不是我为进一步的建议和调试而存储的。

十六进制应该是57 69 65 73 C582 61 77.
如果你得到57 69 65 73 C385 E2809A 61 77,那么你有“双重编码”。


推荐阅读