如何使用 jquery $.post 确保以 UTF8 提交的变量

Posted

技术标签:

【中文标题】如何使用 jquery $.post 确保以 UTF8 提交的变量【英文标题】:How to ensure variables submitted in UTF8 using jquery $.post 【发布时间】:2011-11-02 21:31:09 【问题描述】:

我已经为此苦苦挣扎了三天,这就是我所得到的,我不明白为什么我会看到这种行为。

我的问题是我有一个 mysql 西班牙数据库,其字符集和排序规则定义为 utf8_general_ci。当我像这样在 delete.php 中查询数据库时"DELETE FROM countryNames WHERE country = '$name'"

指定的行不会被删除。我通过 post 变量 $name=$_post['data'] 在 delete.php 中设置变量 $name 。主要是 $name 获取西班牙语字符的值,例如 español、México 等。 delete.php 文件从 main.php 调用。如果我从 main.php $.post("delete.php", data:filename); 发送帖子消息,查询不会删除条目(尽管'filename' 字符串在 utf8 中)但是如果我创建一个表单然后在 main.php 中发布我的数据变量,则查询有效!对我来说最大的问题是为什么我必须提交表格才能使查询起作用?我看到的是我的数据库拒绝该值,如果它来自一个 jquery post call,但当它来自提交的表单时接受它。 (我没有对查询进行任何代码更改。只需通过提交表单来发布值)

【问题讨论】:

对 post 变量执行 var_dump 并查看在这两种情况下得到的结果。 How to set encoding in .getJSON JQuery的可能重复 @Neal:在这两种情况下,它都表示 string(37) 或 string(34) 等。 【参考方案1】:

首先,要查看用于请求的字符集,请安装 Firebug 之类的工具并检查请求/响应的“Content-Type”标头。它看起来像'application/json;字符集=...'。在您的情况下,这应该是 charset=utf-8

我猜为什么它在发布表单时起作用可能是因为x-www-form-urlencoded - 非字母数字字符在客户端额外编码并在服务器上再次解码,这就是直接发布数据的区别。

这意味着工作中的某个地方存在错误的编码。默认情况下,PHP 将您的字符串与其编码无关,因此我倾向于将其排除为错误的根源。 jQuery.post 默认也使用 UTF-8 ......所以我怀疑是 filename 变量。你确定它是UTF-8吗?您在哪里以及如何检索它?

您可能还应该确保实际的 html 页面也以 UTF-8 格式发送,而不是使用 iso-8859-1。看看这个article,了解如何正确处理它。

【讨论】:

感谢您的回复...文件名变量来自我通过 php 脚本读取的硬盘驱动器上的一个文件夹。文件夹名称是西班牙文本中的国家/地区名称。 在 Windows、Linux、Mac 上?因为例如 Windows 上的 NTFS 使用 UTF-16 作为其文件名,所以这可能已经是你的问题了...... im on mac..另外,如果我自己在代码中使“文件名”等于español,而不是从磁盘读取它。它有效:S ...所以总而言之,文件名不在 utf-8 中!但我在 post call 前后检查编码(mb_detect_encoding()),它给了我 UTF-8:S 嗯,没有太多使用Mac的经验...但是他们应该使用类似于Linux的平台默认编码。您可以使用 iconv 来强制执行 UTF-8 编码。【参考方案2】:

伙计们,这是 Mac 的问题!!我刚刚在 Windows 作为我的服务器上对其进行了测试,现在一切正常。所以当你使用 Mac 作为服务器,MySql 使用 UTF8 作为字符集和排序规则时要小心。我猜 Mac 以某种不同的编码而不是 UTF-8 存储文件夹和文件名。

【讨论】:

【参考方案3】:

你的答案可能在这里:How to set encoding in .getJSON JQuery

正如上面所说,使用$.ajax 而不是$.post,您可以设置编码。

或者,正如第二个答案中所说,使用$.ajaxSetup 相应地设置编码。

【讨论】:

【参考方案4】:

使用 .serialize() !我认为它会起作用。更多信息:http://api.jquery.com/serialize/

【讨论】:

以上是关于如何使用 jquery $.post 确保以 UTF8 提交的变量的主要内容,如果未能解决你的问题,请参考以下文章

如何发送 POST 请求以使用 jquery 登录到 url

如何使用 UICollectionViewCompositionalLayout 创建具有相等行高的网格布局

如何根据用户当前输入以编程方式访问匹配值列表 - jQuery Autocomplete?

如何使用 jQuery 的 $.post 函数获取“位置”标题?

angular js jquery中post请求的一点小区别

在 httpClient 中使用 POST 时如何确保数据被加密