表情符号在插入数据库后显示为问号 php
emojis show up as question marks after inserting into database php
我知道这个问题已经被问过很多次了,我几乎尝试了所有的问题,但结果有所不同,所以请继续阅读!不要投票!正如我所说,我已经尝试了大部分解决方案!
我使用 utf8mb4 作为编码,character_set_connection 和 character_set_database 已设置为 utf8mb4。我网页中的字符集设置为 utf8。我使用过 PDO,当我打开与数据库的连接时,我使用 utf8mb4 作为字符集。表中的列也有 utf8mb4_unicode_ci 因为 collation.The 使用的存储引擎是 MyISAM。
不同之处在于我无法编辑 character_set_server(因为我在共享主机上),它默认设置为 utf8,collation_server 默认设置为 utf8_unicode_ui。我无法以任何方式改变这些。它在具有相似字符变量的本地主机上运行良好。
编辑:
连接变量是$conn,打开方式为
$db_server = 'localhost';
$db_name = 'userdb';
$db_encoding = 'utf8mb4';
$db_user = 'test';
$db_pass = 'password';
$conn = new PDO('mysql:host='.$db_server.';dbname='.$db_name.';charset='.$db_encoding,$db_user,$db_pass);
输入的形式很简单
<form action="" method="POST" accept-charset="UTF-8"><input type="text" class="form-control" name="inp"></form>
输入被处理为
$test = $_POST['inp'];
$it = $conn->prepare("INSERT INTO tbl_test(message) VALUES(?)");
$it->bindParam(1,$test,PDO::PARAM_STR);
if($it->execute()) echo $test;
else echo 'Error!';
所以问题是:
1、为什么我用了utf8mb4和尽可能utf8mb4_unicode_ci还是出现这个问题?
2.Could 这是一个 php 问题而不是 MySQL 问题,因为问题发生在数据库插入期间(我使用了 stripslashes()、trim() 和 htmlspecialchars( ) 字符串函数)?
3.Interestingly 表情符号(unicode 字符)在网站的一个页面(即聊天页面)上运行良好。可能是由于加密?似乎没有可能的解释!
请记住,在回答之前我已经尝试了几乎所有关于 SO 的解决方案,并且由于我在共享主机上,所以我无法编辑 MySQL 配置文件。
请回答,我卡了3天多了!
在字符变量和 mysql 配置上浪费了大量时间后,我用 base64_encode
.
这个简单的解决方案解决了这个问题
通过 base64_encode
传递输入字符串,然后使用 base64_decode
来显示它们在这种情况下有效。然而,字符串比以前占用更多 space,但这个解决方案非常简单且值得。
我刚刚发布了这个问题,想知道是否有人遇到过类似的问题,但人们真的不明白问题的要点。这就是 SO 上的人们真正精疲力尽的地方。无论如何感谢您的帮助! :)
有很多东西需要声明 utf8mb4
-- 列、连接、表单等。顺便说一句,看起来你都做了。
查看此内容了解导致 "question mark" 的原因:
您谈到了 2 个 character_set
个变量,但不是所需的 3 个变量:
| character_set_client | utf8mb4 |
| character_set_connection | utf8mb4 |
| character_set_results | utf8mb4 |
看看你的php.ini有没有default_charset UTF-8
不要使用任何形式的encode/decode,它只会避免解决问题。
请向我们展示 echo bin2hex($text);
一些表情符号。
我知道这个问题已经被问过很多次了,我几乎尝试了所有的问题,但结果有所不同,所以请继续阅读!不要投票!正如我所说,我已经尝试了大部分解决方案!
我使用 utf8mb4 作为编码,character_set_connection 和 character_set_database 已设置为 utf8mb4。我网页中的字符集设置为 utf8。我使用过 PDO,当我打开与数据库的连接时,我使用 utf8mb4 作为字符集。表中的列也有 utf8mb4_unicode_ci 因为 collation.The 使用的存储引擎是 MyISAM。
不同之处在于我无法编辑 character_set_server(因为我在共享主机上),它默认设置为 utf8,collation_server 默认设置为 utf8_unicode_ui。我无法以任何方式改变这些。它在具有相似字符变量的本地主机上运行良好。
编辑:
连接变量是$conn,打开方式为
$db_server = 'localhost';
$db_name = 'userdb';
$db_encoding = 'utf8mb4';
$db_user = 'test';
$db_pass = 'password';
$conn = new PDO('mysql:host='.$db_server.';dbname='.$db_name.';charset='.$db_encoding,$db_user,$db_pass);
输入的形式很简单
<form action="" method="POST" accept-charset="UTF-8"><input type="text" class="form-control" name="inp"></form>
输入被处理为
$test = $_POST['inp'];
$it = $conn->prepare("INSERT INTO tbl_test(message) VALUES(?)");
$it->bindParam(1,$test,PDO::PARAM_STR);
if($it->execute()) echo $test;
else echo 'Error!';
所以问题是:
1、为什么我用了utf8mb4和尽可能utf8mb4_unicode_ci还是出现这个问题?
2.Could 这是一个 php 问题而不是 MySQL 问题,因为问题发生在数据库插入期间(我使用了 stripslashes()、trim() 和 htmlspecialchars( ) 字符串函数)?
3.Interestingly 表情符号(unicode 字符)在网站的一个页面(即聊天页面)上运行良好。可能是由于加密?似乎没有可能的解释!
请记住,在回答之前我已经尝试了几乎所有关于 SO 的解决方案,并且由于我在共享主机上,所以我无法编辑 MySQL 配置文件。 请回答,我卡了3天多了!
在字符变量和 mysql 配置上浪费了大量时间后,我用 base64_encode
.
这个简单的解决方案解决了这个问题
通过 base64_encode
传递输入字符串,然后使用 base64_decode
来显示它们在这种情况下有效。然而,字符串比以前占用更多 space,但这个解决方案非常简单且值得。
我刚刚发布了这个问题,想知道是否有人遇到过类似的问题,但人们真的不明白问题的要点。这就是 SO 上的人们真正精疲力尽的地方。无论如何感谢您的帮助! :)
有很多东西需要声明 utf8mb4
-- 列、连接、表单等。顺便说一句,看起来你都做了。
查看此内容了解导致 "question mark" 的原因:
您谈到了 2 个 character_set
个变量,但不是所需的 3 个变量:
| character_set_client | utf8mb4 |
| character_set_connection | utf8mb4 |
| character_set_results | utf8mb4 |
看看你的php.ini有没有default_charset UTF-8
不要使用任何形式的encode/decode,它只会避免解决问题。
请向我们展示 echo bin2hex($text);
一些表情符号。