当前位置: 首页 > 知识库问答 >
问题:

向JS/PHP脚本添加UTF-8支持[duplicate]

司迪
2023-03-14

我正在开发一个页面,该页面使用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,它成功了!

共有3个答案

丁业
2023-03-14

这是我用来让你的代码工作的:

<?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_-binutf8_-bin进行了测试,在这两种情况下都有效。

PHP版本7.3.9

mysqli5.0.12-dev

上官砚文
2023-03-14

如果您的数据库是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风格是否已经进行了编码。

傅元龙
2023-03-14

ا"...راكز是Mojibake,或者可能是双重编码, المراكز -- 请执行SELECT co,hex(co)...来查看这些代码中的哪一个看起来像:

Mojibake:D8A7D984D985D8B1D8A7D983D8B2
双重编码:C398C2A7C399E2809EC399E280A6C398C2B1C398C2A7C399C692C398C2B2

如果是Mojibake:

  • 要存储的字节需要经过UTF-8编码。解决这个问题。
  • INSERTing和SELECTing文本时的连接需要指定utf8或utf8mb4。解决这个问题。
  • 该列需要声明CHARACTER SET utf8(或utf8mb4)。解决这个问题。
  • 超文本标记语言应该以开头

如果双重编码:这是由从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文件(如果您在文件中使用特殊字符,如上面的示例所示) 您输出的标题