首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >向JS/PHP脚本添加UTF-8支持

向JS/PHP脚本添加UTF-8支持
EN

Stack Overflow用户
提问于 2019-11-19 05:36:52
回答 5查看 1.8K关注 0票数 11

我正在开发一个使用JavaScipt通过AJAX向PHP脚本发送数据的页面。问题是,如果输入不是基于拉丁语的语言,我就会在MySQL表中存储胡言乱语。拉丁字母很好用。

该页面本身能够呈现UTF-8字符,如果它们在页面加载时提供的数据中,这是我很难理解的帖子。

اختبار

还有拯救。请参阅浏览器开发工具中的Network请求。

该职位是通过以下JS功能设置的

代码语言:javascript
运行
复制
function createEmptyStack(stackTitle) {
    return $.ajax({
        type:'POST',
        url:'ajax.php',
        data: {
            "do": 'createEmptyStack',
            newTitle: stackTitle
        },
        dataType: "json"
    });
}

这是我的PHP代码。

代码语言:javascript
运行
复制
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."')");

当我检查页面上的编码时,像这样:

代码语言:javascript
运行
复制
mb_detect_encoding($_POST['newTitle'], "auto");

我得到的结果是:UTF-8

我还尝试了以下标题:

代码语言:javascript
运行
复制
header("Content-type: application/json; charset=utf-8");

数据应该传递的MySQL表排序规则被设置为MySQL

我有另一个页面,它有一个表单,用户可以填充相同的表,并且它可以很好地处理任何语言。当我检查另一个页面为什么能够成功地将类似的数据插入到db时,我看到下面的insert查询:

代码语言:javascript
运行
复制
mysql_query("SET NAMES utf8");

我试图在我的查询上加上同样的行,认为这些数据看起来仍然是胡说八道。我还尝试了以下几种选择:

代码语言:javascript
运行
复制
 mysql_query("SET CHARACTER SET utf8 ");

代码语言:javascript
运行
复制
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,并且它工作了!

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2019-11-21 23:49:08

المراكز是المراكز的Mojibake,或者可能是“双重编码”-请执行SELECT col, hex(col) ...来查看其中哪个看起来像:

Mojibake:D8A7D984D985D8B1D8A7D983D8B2

双重编码:C398C2A7C399E2809EC399E280A6C398C2B1C398C2A7C399C692C398C2B2

如果Mojibake:

  • 要存储的字节需要UTF-8编码.把这个修好。
  • 当INSERTing和SELECTing文本需要指定utf8或utf8mb4时的连接。把这个修好。
  • 该列需要声明为字符集utf8 (或utf8mb4)。把这个修好。
  • HTML应该从<meta charset=UTF-8>开始。

如果双重编码:这是由从latin1 (或其他什么)转换到utf8引起的,然后将这些字节视为latin1并重复转换。

更多讨论:

UTF-8字符的麻烦;我看到的不是我存储的东西。

不要在PHP中使用mysql_*接口;切换到mysqli_*或PDO接口。mysql_*在PHP5.7中被删除。

票数 5
EN

Stack Overflow用户

发布于 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:

代码语言:javascript
运行
复制
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

当您发布数据时,可以在发送XHR请求之前使用encodeURIComponent对其进行编码。我不确定jQuery风格的$.ajax是否已经完成了编码。

票数 3
EN

Stack Overflow用户

发布于 2019-11-21 07:58:26

这就是我以前用来让您的代码工作的东西:

代码语言:javascript
运行
复制
<?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头部:

代码语言:javascript
运行
复制
<meta charset="utf-8">

我用latin1_binutf8_bin进行了测试,在这两种情况下都有效。

PHP版本7.3.9 MySQLi 5.0.12-dev

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58927296

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档