jQuery AJAX字符编码

时间:2009-02-16 14:30:50

标签: jquery ajax character-encoding

我目前正在编写一个法国网站。有一个计划页面,侧面的链接可用于加载另一天的计划。

这是我用来做这个的JS:

    <script type="text/javascript">
    function load(y) {
        $.get(y,function(d) {
            $("#replace").html(d);
            mod();
        });
    }
    function mod() {
        $("#dates a").click(function() {
            y = $(this).attr("href");
            load(y);
            return false;
        });
    }
    mod();
    </script>

实际的AJAX就像一个魅力。我的问题在于对请求的响应。

因为它是法国网站,所以有许多重音字母。出于这个原因,我正在使用ISO-8859-15字符集。但是,在对我的AJAX请求的响应中,重音变成了?因为字符编码似乎已经变回UTF-8。

我该如何避免这种情况?我已经尝试在请求的文档顶部添加一些PHP来设置字符集:

<?php header('Content-Type: text/html; charset=ISO-8859-15'); ?>

但这似乎也不起作用。有什么想法吗?

此外,虽然你们任何人都在这里看...为什么加载新页面时最右边的列似乎变小了,导致表变形,<li>中的每个<td>换行到下一行?

干杯

23 个答案:

答案 0 :(得分:62)

在AJAX调用上指定内容类型解决了我在挪威网站上的问题。

$.ajax({
        data: parameters,
        type: "POST",
        url: ajax_url,
        timeout: 20000,
        contentType: "application/x-www-form-urlencoded;charset=ISO-8859-15",
        dataType: 'json',
        success: callback
});

您还必须在服务器上指定字符集。

<?php header('Content-Type: text/html; charset=ISO-8859-15'); ?>

答案 1 :(得分:23)

UTF-8应该处理所有重音和外来字符 - 为什么不在数据源上使用它?

修改
[Archive copy of the test file.]包含您的数据

首先应该是UTF-8。我在notepad ++中加载文件,转换为utf-8并手动将字符改为重音符号。一旦完成,一切都像魅力一样。

顺便说一句,除非你的服务器被定义为php-process .html文件,否则你用ajax加载的文件都没有得到你的iso字符集。如果你坚持使用iso charset,请求php文件而不是html文件,并在标题中定义charset(不在文件本身中)

答案 2 :(得分:19)

$str=iconv("windows-1250","UTF-8",$str);

最终帮助我的是什么

答案 3 :(得分:10)

您需要将服务器设置为使用ISO-8859-15作为字符编码(添加适当的HTTP标头)。在html的主体中执行它将无济于事。

我可以看到这一行

<?php header('Content-Type: text/html; charset=ISO-8859-15'); ?>

在你的HTML源码。这不应该发生。使用Live HTTP标头我看不到相应的charset HTTP标头。将它用于第一页和ajax服务。

答案 4 :(得分:7)

对于我的PHP应用程序,解决方案是包含utf8_decode函数,用于$_POST中的每个变量。

Ex :(服务器端)

if( strtoupper($_SERVER['REQUEST_METHOD']) == "POST" ){
$variable = htmlentities($_POST['variable']); // wrong
$variable = htmlentities( utf8_decode($_POST['variable']) ); // right
}

Abraços!!! (再见!!!)

答案 5 :(得分:7)

我强烈建议使用javascript escape()方法

你可以通过抓取像这样的表单值来使用jQuery:

var encodedString = escape($("#myFormFieldID").val());

答案 6 :(得分:6)

打印出ajax文件中的变量时。放一个

htmlentities()

在他们周围,看看它是否有效。在冰岛的ajax应用程序中为我工作。

答案 7 :(得分:4)

我遇到过类似的问题,在西班牙语门户网站的内容评论系统中工作。 什么最终解决了我的问题,经过几个小时的搜索,而不是搞乱jQuery字符集,似乎使用utf-8无论如何,它是从处理的PHP中的utf-8解码回ISO-8859-1 ajax POST。在PHP中有一个内置函数utf8_decode(),所以我对注释字符串做的第一件事就是:

$comentario = utf8_decode($_POST['comentario']);

(然后我使用nl2br()htmlentities() PHP函数来准备要用html实体而不是特殊字符存储的文本。

祝你好运和平到处都是! 西巴

答案 8 :(得分:3)

我一直在解决这个问题,并发现这个解决方案适用于Firefox和Safari(是的,我现在在Mac上)。

获取请求时,我在这里创建了一个content-type = iso-8859-1:

if (window.XMLHttpRequest) { // Mozilla, Safari, ...
  httpRequest = new XMLHttpRequest();
        if (httpRequest.overrideMimeType) {
            httpRequest.overrideMimeType('text/xml; charset=ISO-8859-1');
        }
    }

如果有人发现这不起作用,请告诉我。

答案 9 :(得分:3)

我的网页上有一个与ASP类似的问题。我已经解决了这个问题:

1)在Jquery ajax方法调用的ASP文件的开头插入指令:

Response.Charset = "windows-1252"

在我的asp页面之前没有定义charset并且我用ANSI编码保存了我的文件(用文本编辑器作为记事本++)

2)在使用jquery ajax方法调用ASP文件的html文件中,我插入了您在下面看到的参数content-type:

$.ajax({         
data: parameters,         
type: "POST",         
url: ajax_url,
datatype: 'html',         
contentType: "text/html;charset=windows-1252",

简而言之,在您的ASP文件中定义称为charset非常重要。奇怪的是,我看到我的jquery与windows-1252一起工作,但不适用于ISO-8859-1 charset:在这种情况下,jquery ajax方法会给出异常。

答案 10 :(得分:3)

我有一个问题,瑞典语/挪威语字母显示为问号,尽管已指定:

contentType: "application/json; charset=utf-8",

通过在字符串中添加encodeURIComponent来解决这个问题。

url: "/set_comment.do?text=" + encodeURIComponent(comment),

答案 11 :(得分:2)

我尝试了许多建议,用德语特殊字符(ä,ö,ü)阅读文本文件。最后:

 $.ajax({
        async:false,
        type: "GET",
        url: "data/FileName.txt",
        dataType: "text",
        contentType: "application/x-www-form-urlencoded;charset=UTF-8",
        success: function (data) {
           alert(data);
        }
    });

让我读一下特殊字符,但仅在我明确以UTF-8格式保存FileName.txt 之后。在Windows编辑器中保存文本文件的标准格式为 ANSI ,而不是 UTF-8,,但如果您“另存为”并使用旁边的保管箱,则可以更改它保存按钮或使用更好的编辑器开始。

答案 12 :(得分:1)

我不同意一切都必须是UTF-8,你可以使它与ISO 8859完美配合,我做了,请在这里阅读我的回复。

my response in stackoverflow

答案 13 :(得分:1)

<script type="text/javascript">
  function GetContent(idUser){ 
    $.ajaxSetup({
      url: 'ping.php'
    });

    $.ajax({
      type: "POST",
      url: "blablabla.php",
      dataType: "text",
      data: ({ParamUserID:idUser}),// here we def wich variabe is assiciated
      contentType: "application/x-www-form-urlencoded; charset=iso-8859-1",
      success: function(html) {
        $('#user_specified_content').html(html);
      }
    });     
  }
</script> 

这是我从blabla.php页面获取内容的脚本。

当我收到成功数据时,我的口音不会出现。

我找到了一个非常好的工作解决方案来获取来自.success函数

的获取数据的重音数据

在我的blabla页面上。我这样做是为了解决我的问题:

我在我的php文件中使用utf8_encode(place your data here)。请参阅下面的操作:

while( $row = sqlsrv_fetch_array($recordset) )
{                           
    <option value="<?php echo $row["xyz"]; ?>"><?php echo utf8_encode($row["gName"]) . ' | ' . utf8_encode($row["gManagerName"]); ?></option>                           
}

答案 14 :(得分:0)

jQuery默认情况下采用UTF-8,要更改此默认值,请执行以下操作:

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.12.4/jquery.min.js">
</script>
<script>
  $.ajaxSettings.mimeType="*/*; charset=ISO-8859-15";// set you charset
</script>

这对我来说很好!...;))...

答案 15 :(得分:0)

我有类似的问题。我有带有法语文本的json数据的文本文件。总是出现显示某些字符的问题。就我而言,JavaScript程序使用Ajax来检索json文本文件,如下所示:

$.ajax({
    async: false,
    type: 'GET',
    url: 'some-url',
    success: function(data, status) {
        mainController.constructionStageMaster = data.records;
     }
});

返回的数据总是有不正确的重音法语字母。

json文本如下所示:

{
    "records": [
        {
            "StageDesc": "Excavation, Fondation et Bases",
            "Allowed": 9,
            "Completed": 0,
            "TotalCompleted": ""
        },
        {
            "StageDesc": "Étanchement et Remblayage",
            "Allowed": 3,
            "Completed": 0,
            "TotalCompleted": ""
        },
        {
            "StageDesc": "Encadrement et revêtement mural intermédiaire",
            "StageDesc_fr": "Encadrement et revêtement mural intermédiaire np++",
            "StageDesc_fr2": "Encadrement et revêtement mural intermédiaire",
            "Allowed": 15,
            "Completed": 0,
            "TotalCompleted": ""
        }
        ...
    ]
}

请注意,在上面的示例数据中,第3个元素,我在文本中放置了正确的é和不正确的ê法语重音字母。

对于您的信息,似乎有一些使用ISO-8859-1字符编码的Eclipse项目的全局配置。在您的情况下,它可能是不同的编码。

在检查上述解决方案并玩弄项目之后,这就解决了我的问题:

  • 查找具有正确显示法文文本的文本来源
  • 复制文字
  • 转到Eclipse,打开包含数据的文本文件
  • 右键单击资源管理器中的文件,打开属性,然后将编码更改为ISO-8859-1
  • 修复文本以使其正确显示。使用复制/粘贴或键盘
  • 您可能必须使用键盘箭头键(左/右)以确保没有隐藏的罪魁祸首字母,这些字母会在HTML上显示有趣的形状。删除这样隐藏的信件
  • 保存文件

现在,在我的情况下,我没有在Ajax调用中指定任何编码选项,它工作正常。另外,如果我用json数据更改文本文件的编码,它仍然可以正常工作。

塔雷克

答案 16 :(得分:0)

我试图使用$ .ajax读取本地json / text文件,并且编码最初没有用。我通过将json文件保存为UTF-8编码来实现它。 这可以通过Windows记事本简单地完成..使用“另存为”,然后在文件名下面,您可以将编码设置为UTF-8。

祝你好运!

答案 17 :(得分:0)

如果您正在使用CodeIgniter,您可以通过在加载任何视图之前将以下代码添加到Controller来解决此问题(假设您已在配置上正确设置charset。如果没有,请放置charset=whateveryouwant

$this->output->set_header('Content-type: text/html; charset='.$this->config->item('charset'));

我这样做的方法是将该行添加到MY_Controller的构造函数中,这是我所有控制器的超类,这样我就确保在任何地方都没有编码问题。

顺便说一下,这不会影响JSON返回(以UTF-8编码)。

答案 18 :(得分:0)

我提出这个问题与提问者的问题完全相同。这里的答案非常有说服力,我几乎尝试了每一个建议的答案。这里没有任何答案对我有用 - 我的问题可能略有不同。这似乎是许多人的情况。在结束答案之前我做了很多尝试。

所以现在我正在添加已经很长的答案列表,我自己的解决方案解决了我的编码问题。

我做了两件事。在数据库连接脚本中,我添加了:

mysql_set_charset('utf8',$connection);

除此之外:

  • 我将所有文件的编码更改为UTF-8

重点是所有内容必须具有相同的编码。在创建新的php文件时,对于脚本来说仅仅更改脚本中的编码是不够的 - 文件本身必须正确编码。

答案 19 :(得分:0)

我遇到了同样的问题并尝试了几种方法。我找到了解决方案。如果您为“接受”设置请求标头,如下所示;

$.ajax({
        data: parameters,
        type: "POST",
        url: ajax_url,
        dataType: 'json',
        beforeSend : function(xhr) {
            xhr.setRequestHeader('Accept', "text/html; charset=utf-8");
        },
        success: callback
});

您将看到所有字符看起来都是正确的

答案 20 :(得分:0)

如果整个应用程序使用的是ISO-8859-1,您可以修改jquery.js替换encodeURIComponent的所有出现escape(在当前的jquery脚本中有2次要替换 - 1.5.1)

有关详细信息,请参阅encodeUIComponentescape

答案 21 :(得分:0)

刚刚将{"type":"GET"}更改为{"type":"POST"},就像ISO-8859-1

的魅力一样

答案 22 :(得分:0)

我的网页遇到了同样的问题:

  • 正常通话时显示正常
  • 通过ajax请求调用特殊字符时搞砸了

为了解决这个问题(使用php),我在源数据上使用了utf8_encode()htmlentities()。两者都有效,我在不同的项目中使用它们。