【发布时间】:2015-01-04 17:19:00
【问题描述】:
我得到了一个 php 脚本,它从 Steam web-api 获取昵称并将它们插入到 mysql 数据库中。他们中的许多人都有罕见的俄语和希腊语字符。我在 php.ini 和所有带有
的 php 文件中将 php 设置为 utf-8mb_internal_encoding('utf-8');
我的 PDO 连接器配置为处理 utf8
$connection = new PDO('mysql:host=localhost;dbname=d2bd;mysql:charset=utf8mb4', 'root', '');
$connection->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$connection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$connection->setAttribute(PDO::ATTR_PERSISTENT, true);
$connection->setAttribute(PDO::MYSQL_ATTR_INIT_COMMAND, "SET NAMES 'utf8mb4' COLLATE 'utf8mb4_unicode_ci'");
我的 mysql 数据库正确配置了 utf8mb4
character_set_client utf8mb4
character_set_connection utf8mb4
character_set_database utf8mb4
character_set_filesystem binary
character_set_results utf8mb4
character_set_server utf8mb4
character_set_system utf8
character_sets_dir C:\xampp\mysql\share\charsets\
collation_connection utf8mb4_unicode_ci
collation_database utf8mb4_unicode_ci
collation_server utf8mb4_unicode_ci
completion_type NO_CHAIN
concurrent_insert AUTO
connect_timeout 10
core_file OFF
简而言之,我接受 web-api 的输入并使用 uft8_encode() 对其进行编码。然后我将它插入到数据库中。问题是一些字符没有很好地编码,当我从数据库中调用它们时,它们都被窃听了。
示例 1:
1.输入 -> Перуанский чертовски
2.编码 -> ÐеÑÑанÑкий ÑеÑÑовÑки
3.插入数据库
4.从数据库中选择 -> Ð?еÑ?Ñ?анÑкий Ñ?еÑ?Ñ?овÑкÐ
5.解码
6.输出 -> ??е???анский ??е???овск�
示例 2:
1.输入 -> $ |/| 1 ↓_ € ♥ J
2.编码 -> $ |/| 1 â_ ⥠J
3.插入数据库
4.Select from DB -> 1 â??_ â?¬ â?¥ J
5.解码
6.输出 -> 1 ???_ ????? J
【问题讨论】:
-
除非您的应用符合 ISO-8859-1,否则无需对字符串进行编码/解码,但看起来并非如此。
-
好吧,如果我不编码和解码他们在数据库中完全被窃听的字符串。在第一个示例中,如果我不对其进行编码,结果是????????? ?????
-
我很确定问题出在其他地方。你的网页字符集是什么?
-
你的意思是html?因为我没有从用户输入中获取名称。我直接从 steamapi 以 JSON 格式获取它们。
-
@holyknight 试试这两行代码:
ini_set("default_charset", "UTF-8");header('Content-type: text/html; charset=UTF-8');
标签: php mysql utf-8 steam-web-api utf8mb4