我正在开发一个页面,该页面使用JavaScipt通过ajaxpost将数据发送到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\u general\u 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",但是我的db表中插入的数据显示为: هذا اختبار
那么,为什么我不跳转到将我的db表转换为不同的排序规则?有几个原因:它有近0.5万条记录,当我进入另一个做非常相似的插入的页面时,它实际上工作正常。
原来我的另一个页面在插入数据时使用ASCII编码。所以很自然,我试图在ajax.php.上转给ASCII。问题最终是空白数据。我现在很困惑...
谢谢
修正:基于一些线索,我最终将这个页面的所有函数都重写为PDO,它成功了!
这是我用来让你的代码工作的:
<?php
$db = mysqli_connect("localhost", "root", "", "demo");
$db->set_charset("utf8");
// Check connection
if ($db === false) {
die("ERROR: Could not connect. " . mysqli_connect_error());
}
$newTitle = trim($_POST['newTitle']);
$db->query("
INSERT INTO t1(project_id, label)
VALUES ('5', '" . $newTitle . "')");
将此标记添加到您的html头:
<meta charset="utf-8">
我用latin1_-bin
和utf8_-bin
进行了测试,在这两种情况下都有效。
PHP版本7.3.9
mysqli5.0.12-dev
如果您的数据库是latin1,它将unicode字符存储为多字节字符。如果它是基于utf-8的,它仍将存储多个字符,但以更“合理”的方式显示。
如果,你的字符被表示为XYZ(3字节),那么当你检索XYZ时,浏览器将把它们重新组合成一个可见的。
然而,如果您的数据库是utf-8,它将进一步编码每个组件,这样您最终就可以“可靠地”看到XYZ。假设X被表示为x1,x2,而Y只是y,而Z是z1,z2,z3,所以你现在看到的是x1x2yz1z2z3,而不是存储为XYZ。
尝试将您的数据库转换为latin1,以至少证实我的理论。谢谢。
编辑:
不需要使用utf8 js库。确保页面的字符编码为utf8:
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
发布数据时,可以在发送XHR请求之前使用encodeURIComponent对其进行编码。我不确定$.ajax的jQuery风格是否已经进行了编码。
ا"...راكز
是Mojibake,或者可能是双重编码, المراكز -- 请执行SELECT co,hex(co)...
来查看这些代码中的哪一个看起来像:
Mojibake:D8A7D984D985D8B1D8A7D983D8B2
双重编码:C398C2A7C399E2809EC399E280A6C398C2B1C398C2A7C399C692C398C2B2
如果是Mojibake:
开头
如果双重编码:这是由从latin1(或其他)转换为utf8引起的,然后将这些字节视为latin1并重复转换。
更多讨论:
UTF-8字符的问题;我看到的不是我存储的
不要在PHP中使用
mysql_*
接口;切换到mysqli_*
或PDO接口。
我目前在按钮按钮上用于“显示当天报价”的脚本缺少一个功能:链接支持= 仅仅添加一个普通的“href”不起作用,它只显示为文本。 还有别的办法吗?
请查看Servlet类中的注释。如果将更改为,则无法访问应用程序。 为什么会出现这个问题?
WebSocket 使用一种被称作“Upgrade handshake(升级握手)”的机制将标准的 HTTP 或HTTPS 协议转为 WebSocket。因此,使用 WebSocket 的应用程序将始终以 HTTP/S 开始,然后进行升级。这种升级发生在什么时候取决于具体的应用;可以在应用启动的时候,或者当一个特定的 URL 被请求的时候。 在我们的应用中,仅当 URL 请求以“/ws”结束时,我
我有一个比较简单的问题,就是尝试将内联脚本添加到React组件中。我目前所掌握的: 我还尝试过: 这两种方法似乎都无法执行所需的脚本。我想我错过的是一件简单的事。有人能帮忙吗? PS:忽略foobar,我有一个真实的id实际上在使用,我不想分享。
Ruby 与 Git grit jgit + jruby PHP 与 Git Python 与 Git pygit Perl 与 Git perlgit 译者注: 此章的英文版原文也只是列出了大纲, 因此中文版看出起就很单薄, 以后我们尽量完善:)
问题内容: 如何将带有国际字符的json编码的字符串保存到数据库,然后在浏览器中解析解码的字符串? 问题答案: 这是一个编码问题。看起来在某些时候,数据被表示为ISO-8859-1。 流程的每个部分都需要UTF-8编码。 数据库连接 数据库表 您的PHP文件(如果您在文件中使用特殊字符,如上面的示例所示) 您输出的标题