我正在开发一个使用JavaScipt通过AJAX向PHP脚本发送数据的页面。问题是,如果输入不是基于拉丁语的语言,我就会在MySQL表中存储胡言乱语。拉丁字母很好用。
该页面本身能够呈现UTF-8字符,如果它们在页面加载时提供的数据中,这是我很难理解的帖子。
اختبار
还有拯救。请参阅浏览器开发工具中的Network请求。
该职位是通过以下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表排序规则被设置为MySQL
我有另一个页面,它有一个表单,用户可以填充相同的表,并且它可以很好地处理任何语言。当我检查另一个页面为什么能够成功地将类似的数据插入到db时,我看到下面的insert查询:
mysql_query("SET NAMES utf8");我试图在我的查询上加上同样的行,认为这些数据看起来仍然是胡说八道。我还尝试了以下几种选择:
mysql_query("SET CHARACTER SET utf8 ");和
mysql_set_charset('utf8', $db);...but无效。我被踩了。需要帮忙把它弄清楚。
环境:
PHP 5.6.40 (Cgi) MySQL 5.6.45
更新
我做了更多的测试。
我在阿拉伯语-هذااختبار中使用了一个短语“这是一个测试”。
ajax.php代码似乎工作正常。在db insert后,它返回UTF-8编码值,该值看起来类似于:"\u0647\u0630\u0627 \u0627\u062a\u062a\u0628\u0627\u0631“,而编码设置为:”UTF-8“,但我的db表中插入的数据显示为:‡°N§§§N§O.
那么,为什么我不跳到将我的db表转换成不同的排序规则呢?原因有两个:它几乎有.5 mil记录,当我转到另一个执行非常类似插入的页面时,它实际上正常工作。
原来我的另一个页面是在插入数据时使用ASCII编码。所以,这是很自然的,我试图在ajax.php上进行ASCII。我用空白数据结束的问题。我现在很困惑..。
谢谢
修复:基于一些线索,我最终重写了这个页面的所有函数到PDO,并且它工作了!
发布于 2019-11-19 05:55:07
如果您的数据库是latin1,它将将unicode字符存储为多字节字符.如果它是基于utf-8的,它仍然会存储多个字符,但显示的方式更“明智”。
如果您的ر字符表示为XYZ (3个字节),那么当您检索XYZ时,浏览器将它们重新组合成一个可见的ر。
但是,如果您的数据库是utf-8,那么它将进一步对每个组件进行编码,以便您最终“可靠地”看到XYZ。假设X被表示为x1,x2,Y只是y,Z是z1,z2,z3,所以没有看到存储为XYZ的ر,现在您看到的是x1x2yz1z2z3,它显示为XYZ。
尝试将您的数据库转换为latin1,以至少证实我的理论。谢谢。
编辑:
不需要使用utf8 js库。确保页面的字符编码为utf8:
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />当您发布数据时,可以在发送XHR请求之前使用encodeURIComponent对其进行编码。我不确定jQuery风格的$.ajax是否已经完成了编码。
https://stackoverflow.com/questions/58927296
复制相似问题