【问题标题】:jQuery / AJAX / php encoding nightmarejQuery / AJAX / php 编码噩梦
【发布时间】:2026-01-06 06:50:01
【问题描述】:

首先,我的数据库编码是utf-8。

我必须通过POST 方法将字符串Fußball 发送到index.php。当我使用带有action="index.php" 的HTML 表单发送它时,它以Fu%DFball 发送并正确返回它,我在php 文件上使用htmlentities()。它工作得很好。当我尝试使用 jQuery/AJAX 发送它时,问题就开始了。

$("#Form").submit(function() {
$.ajax({
    type: "POST",
    dataType : "text",
    url: "index.php", //Does the validation
    data: $("#Form").serialize(),
    success: function(data) {
        alert(data)
    },
});
return false;
});

它以Fu%C3%9Fball 发送并以Fuà 返回,我尝试了一切来解码它或以不同的方式发送它。以下是在各种情况下返回的内容:

正常发送,在php文件中带有htmlentities()

FuÃ

正常发送,没有htmlentities() 或在php 文件中带有htmlspecialchars()

Fußball

正常发送,php文件中有utf8_decode()

Fu

在发送字符串之前在 jQuery 脚本上使用 escape()encodeURIComponent()contentType: "utf-8" 会使表单以 .php 文件无法理解的方式提交,但不仅如此,它仍然会发送字符串为Fu%C3%9Fball

我还为每种文件类型使用了正确的命令,将我的所有文档编码为utf-8,这没有任何区别,所以我假设一开始都是utf-8

【问题讨论】:

  • 首先,摆脱所有htmlentities() 调用——这需要在根目录下修复,不需要创建实体。你的 page 编码是什么?看起来它可能不是 UTF-8。你能把它变成 UTF-8 吗?
  • 也应该是 utf-8。我在进行测试时添加了mb_internal_encoding("UTF-8");,看看这是否是问题所在并且没有任何影响。
  • 打开页面时查看浏览器的“编码”菜单。这是关于使用什么编码的最后一句话
  • 奇怪的是它不是 utf-8。这次我改用header('Content-type: text/html; charset=utf-8');,问题就解决了。关于为什么默认情况下它不是 utf-8 的任何想法?我的语言环境是 utf-8,我从来没有设置过任何不同的东西......
  • 我添加了一个答案。您可能需要查看默认内容类型的服务器设置

标签: php jquery ajax encoding utf-8


【解决方案1】:

确保您的网页页面的编码也是 UTF-8。

如果默认是 ISO-8859-1,它会错误地解析 UTF-8 字符,正如您所经历的那样。

要检查,请在打开页面时查看浏览器的“编码”菜单:这是关于使用何种编码的最后一句话。

可能是您的服务器配置为输出 HTML 文件的 ISO-8859-1 内容类型标头。请参阅 How to change the default encoding to UTF-8 for Apache? 了解如何解决此问题。

【讨论】: