【问题标题】:Getting wrong charset output from AJAX从 AJAX 获取错误的字符集输出
【发布时间】:2016-03-02 19:39:47
【问题描述】:

当我想打印已从服务器接收的 jQuery AJAX 的输出时。它没有显示正确的字符集。我真正想要的是得到Š,而不是得到?。所有文件 script.js 和服务器 php proceed.php 都保存为 UTF-8 并设置为 UTF-8。数据库也设置为 UTF-8。我已经尝试了大部分事情。 在 AJAX 的 .js 文件中:

  $.ajaxSetup({
    url: "proceed.php", //file to procces data
    ContentType : 'charset=UTF-8', // tried here
    global: false,
    type: "POST", 
    dataType: "html"
});

.php 文件中:

mysql_query("SET NAMES utf8");
$output = utf8_decode($sql_result);

所有可能的组合。

更新: 我已经尝试了所有可能的变体中的所有建议方法,并且通过使用它们,我没有得到服务器的任何响应。我得到至少一些响应的唯一一次是上面提到的设置 - 从字面上看。设置 AJAX dataType: "text/html"dataType: "application/html" 没有帮助。

代码: PHP

if(!empty($_POST['select_had'])){
$zem = $_POST['select_had'];
$vysledek = mysql_query("SELECT typ_hadanky, jazyk FROM hlavolam RIGHT JOIN hadanka ON hlavolam.id_hlavolamu=hadanka.id_hlavolamu WHERE zeme_puvodu='$zem'");
$out = "";
while ($zaznam = mysql_fetch_array($vysledek)) {
    $zaz = $zaznam['jazyk'];
    $out .= "<option>".$zaz."</option>";
}
$vys = utf8_decode($out);
echo $vys;

}

jQuery:

$("#sel_had_zem").change(function(){
var select_had = $("#sel_had_zem option:selected").text();
console.log(select_had);
$.ajax({
  data:{'select_had':select_had},
  success: function(data){
      console.log(data);
      $("#sel_had_jaz option").nextAll().remove();
      $("#sel_had_jaz").append(data);
  },
  error: function(){
      alert('No server response');
  }
 });

});

【问题讨论】:

  • 尝试contentType: 'charset=utf-8' 并执行'dataType application/html'
  • 我可能是错的,但我相信您的数据:是错误的。需要data:{"select_had":"select_had"}, 您只有一个单引号围绕键,但没有引号围绕值? @克鲁尔曼
  • 这不是问题
  • 你的 ajax jquery 中没有 type: "POST"
  • $.ajaxSetup({}); 将其设置为任何 jQuery.ajax 的默认值

标签: php jquery ajax utf-8


【解决方案1】:

您需要在 MySQL 连接中设置字符集,而不是在 MySQL 查询中。如果您使用的是 MySQLi,那么您可以 mysqli_set_charset() 内置 PHP 函数。但是,如果您使用的是 PDO,那么您可以像这样使用它:

new PDO('mysql:host=localhost;dbname=DBNAME;charset=utf8;', USERNAME, PASSWORD);

您可以在此处找到有关 mysqli_set_charset() 函数的更多信息: http://www.w3schools.com/php/func_mysqli_set_charset.asp

注意:请同时确保您已在HEAD 标签中添加了&lt;meta charset="UTF-8"&gt;

【讨论】:

  • 我使用的是经典的旧 MySQL,不能使用 MySQLi 查询
  • 我相信还有一个名为mysql_set_charset() 的内置PHP 函数,它接受两个参数。这应该有效。但是,我不太有信心,因为此功能已被弃用。 $connection = mysql_connect('localhost', 'user', 'password');mysql_set_charset('utf8', $connection);
【解决方案2】:

您希望将 PHP 页面的输出设置为 UTF-8 并更正 MIME 类型:

mysql_query("SET NAMES utf8");
header( 'Content-Type: text/html; charset=utf-8' );
echo $sql_result;
exit;

这应该可以解决问题!

【讨论】:

  • 不起作用。它的行为很有趣。重新加载页面后,会自动下载某种系统文件。
  • php 手册使用Content-Type: text/html。不知道是不是更好还是只是http协议的老版本?
  • 从那以后我就一直在用这个
【解决方案3】:

尝试更改以下内容..

dataType: 'html'

dataType: 'application/html'

保持

contentType: 'charset=utf8'

并将&lt;?php header('Content-Type: application/html; charset=utf8'); ?&gt; 添加到页面顶部。

对于错误报告,请将error_reporting(E_ALL); 放在页面顶部。如果出现任何错误,请发布该行的代码,并在您的 OP 帖子中发布错误消息。

为你的错误

Resource interpreted as Document but transferred with MIME type application/html

在您的请求标头中,您发送了 Content-Type: html ,这意味着您希望将响应解释为 HTML。现在,即使服务器向您发送 PDF 文件,您的浏览器也会尝试将其理解为 HTML。这就是问题所在。

所以需要一些信息来了解您到底要发送什么以及接收端如何处理这些数据?

【讨论】:

  • 没有帮助。我现在根本没有得到任何回应。
  • 您是否在实际的 html/php 页面中指定您的字符集,例如 &lt;?php header('Content-Type: application/html; charset=utf8'); ?&gt; ?你可以试试text/html application/html@Croolman
  • 我在原始 php 文件中有这些标题。而且我还尝试按照建议更改它们。没有效果。
  • 您的服务器运行的是什么版本的 PHP?
  • error_reporting(E_ALL); 添加到所有代码文件的顶部。通过这些步骤来处理您正在尝试做的事情,它应该会排除一些错误和行号。发布错误来自的行号。
猜你喜欢
  • 1970-01-01
  • 2013-06-25
  • 2017-10-16
  • 1970-01-01
  • 2020-06-24
  • 1970-01-01
  • 2021-06-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多