我正在使用JavaScipt通过AJAX POST将数据发送到PHP脚本的页面上工作。问题是,如果输入的语言不是基于拉丁语的,我最终会在MySQL表中存储乱码。拉丁字母效果很好。
页面本身能够呈现UTF-8字符,如果它们位于页面加载时提供的数据中,这就是我要努力解决的问题。
??????
并保存。请参阅浏览器开发工具中的网络POST请求。
该帖子是通过以下JS函数制作的
function createEmptyStack(stackTitle) { return $.ajax({ type:'POST', url:'ajax.php', data: { "do": 'createEmptyStack', newTitle: stackTitle }, dataType: "json" }); }
这是我的PHP代码。
header('Content-Type: text/html; charset=utf-8'); $newTitle = trim($_POST['newTitle']); $db->query(" INSERT INTO t1(project_id, label) VALUES (".$_SESSION['project_id'].", '".$newTitle."')");
当我像这样检查页面上的编码时:
mb_detect_encoding($_POST['newTitle'], "auto");
我得到结果:UTF-8
我还尝试了以下标头:
header("Content-type: application/json; charset=utf-8");
应该将数据存放在的MySQL表排序规则设置为utf8_general_ci
我还有另一个页面,该页面具有一种形式,用户可以在其中填充相同的表格,并且可以与任何语言完美配合。当我在另一页上查看为什么它能够将相似的数据成功插入db时,我看到以下上面的插入查询:
mysql_query("SET NAMES utf8");
我尝试在查询上方添加同一行,以使数据看起来仍然很乱。我还尝试了以下几种替代方法:
mysql_query("SET CHARACTER SET utf8 ");
和
mysql_set_charset('utf8', $db);
...但无济于事。我被踩了。需要帮助弄清楚它。
环境:
PHP 5.6.40(cgi-fcgi)
MySQL 5.6.45
更新
我进行了更多测试。
我用阿拉伯语短语“这是测试”-??? ??????
看来ajax.php代码可以正常工作。db插入后,它返回UTF-8编码的值,如下所示:“ \ u0647 \ u0630 \ u0627 \ u0627 \ u062e \ u062a \ u0628 \ u0627 \ u0631”,并且编码设置为:“ UTF-8”,但是在我的数据库表中插入的数据显示为:هذااختبار
那么,为什么不跳到将数据库表转换为其他排序规则呢?有几个原因:它有将近0.5百万的记录,当我转到执行与INSERT非常相似的另一页时,它实际上可以正常工作。
原来我的另一页在插入数据时正在使用ASCII编码。因此,我尝试在ajax.php上转换为ASCII是很自然的。我最终遇到的问题是空白数据。我现在很困惑
谢谢
修正:根据一些线索,我最终将此页面的所有功能重写为PDO,它起作用了!
المراكز
是Mojibake,或者可能是“双重编码”,用于??????? -请SELECT col, hex(col) ...
查看以下哪个:
Mojibake:D8A7D984D985D8B1D8A7D983D8B2
双重编码:C398C2A7C399E2809EC399E280A6C398C2B1C398C2A7C399C692C398C2B2
如果Mojibake:
要存储的字节需要UTF-8编码。解决这个问题。
插入和选择文本时的连接需要指定utf8或utf8mb4。解决这个问题。
该列需要声明为CHARACTER SET utf8(或utf8mb4)。解决这个问题。
HTML应该以开头。
如果是双重编码:这是由于从latin1(或任何其他形式)转换为utf8,然后将这些字节视为latin1并重复转换而引起的。
更多讨论:
UTF-8字符有问题;我看到的不是我存储的
千万不能使用mysql_*
的PHP接口; 切换到mysqli_*
或PDO接口。 mysql_*
已在PHP 5.7中删除。