使用ajax时UTF8编码无法工作

9
我最近将一些页面更改为通过ajax显示,现在我对为什么utf8编码现在显示一个问号在方框内感到困惑,而之前没有这种情况。
例如,原始页面是index.php。字符集明确设置为utf8并在中。然后我使用php查询数据库。
以下是原始的index.php页面:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html lang="en">
<head>
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
    <title>Title here</title>
</head>
<body class='body_bgcolor'  >

<div id="main_container">
    <?php 
        Data displayed via php was simply a select statement that output the HTML.  
    ?>
</div>

然而,当我添加一个通过ajax填充“main_container”的菜单时,所有的utf8编码都停止工作了。下面是新代码:

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html lang="en">
    <head>
        <meta http-equiv="content-type" content="text/html; charset=UTF-8">
        <title>Title here</title>
    </head>
    <body class='body_bgcolor'  >
<a href="#" onclick="display_html('about_us');"> About Us </a>

    <div id="main_container"></div>

“display_html()”函数调用Javascript页面,该页面使用jQuery Ajax调用来检索存储在PHP页面中的HTML,然后将HTML放置在ID为“main_container”的div中。我在jQuery中设置字符集为utf8,如下所示:
$.ajax({
        async: false,
        type: "GET", 
        url: url, 
        contentType: "charset=utf-8", 
        success: function(data)
            { 
                $("#main_container").html(data);
            }
});

我做错了什么?


我认为这是一个BOM(字节顺序标记)问题。请参考http://www.google.it/search?hl=it&q=+Byte+Order+Mark+(BOM)&aq=f&aqi=&aql=&oq=&gs_rfai=。 - Luca Filosofi
如果你使用PHPMyAdmin,在左侧栏中点击数据库,然后点击“操作”。最后一个选项是更改表字符集,将它们设置为类似于utf8_general_ci的格式,在备份所有数据之前不要进行设置! - Heitor
4个回答

7

编码不仅涉及指定元标签和内容类型 - 文件本身必须真正采用您指定的编码方式,否则会出现乱码

请检查所有内容是否使用UTF-8,包括数据库、数据库连接、表列。同时,请确保任何包含的静态文件也是以UTF-8进行编码。


好的,我已经将所有文件(包括所有包含文件)从ANSI转换为UTF-8。我查看了数据库,但不确定我是否在正确的位置查看。列下面写着“COLLATION”“Latin1_swedish_ci”,但不确定这是什么意思。我还能用什么方法检查数据库表/列是否为utf-8?此外,在我将所有文件保存为utf-8之后,现在出现一个错误,指出“无法发送会话缓存限制器 - 标头已经发送”,但我除了将文件保存为utf-8之外没有更改任何代码,而且在我进行此操作之前一切都正常...不确定发生了什么。谢谢您的帮助。 - Ronedog
就像其他评论所说的那样,这与字节顺序标记有关。请查看其他帖子中的链接,还有http://forum.mamboserver.com/showthread.php?t=42814 - mdma
谢谢你的帮助...有没有关于编辑器的想法?我只用过记事本、记事本2、梦想编程、写字板。这些中的任何一个都可以吗? - Ronedog
好的,我确定我有点让你失望了...不是故意的,只是一个新手...认为这就像改变HTML字符集并保存PHP文件那么简单。我会去解决我应用程序的其他问题...正如你发给我的oreillynet.com网站指出的那样,我认为我的整个配置需要仔细检查,因为可能还有其他问题导致这个错误。解决后我再回来汇报。再次感谢您的帮助。 - Ronedog
谢谢,我已经这样做了,它确实帮了我很多。但是我发现一个有点困惑的问题,我想你可能知道。在浏览器中输出的单词“éditez l'océan”是正确的,但是当我通过phpmyadmin查看数据库中的值时,在同一浏览器中显示为“éditez l'océan”。这是数据库的问题吗?数据库的字符集为UTF8,排序规则为utf8_general_ci。应用程序中的所有内容都正常显示,但我只是想知道为什么会出现这种情况,或者这是否会在以后造成问题...我更愿意现在解决这个问题。谢谢。 - Ronedog
显示剩余10条评论

1

您编写了以下内容:

"display_html()"函数调用了一个JavaScript页面,该页面使用jQuery ajax调用来检索存储在php页面中的HTML

您所说的"存储在php页面中的HTML"是什么意思?如果你想要加载数据并将其显示为<div>的内容,则应相应地格式化已加载的数据。我的意思是它应该是真正的HTML代码片段。此外,除了'contentType'之外,还建议指定'dataType'为"html"或"text"。如果您没有指定任何内容,那么最新版本的jQuery将会根据响应的MIME类型“智能尝试获取结果”。如果您知道'dataType',最好在那里指定。如果您使用ajax,请同时使用默认的'async:true'而不是'false'。

您还应验证jQuery.load方法(请参见http://api.jquery.com/load/)是否是最适合您的选择。如果需要,可以使用该方法加载完整的HTML页面并仅显示其中的一部分:$('#main_container')。load('ajax/about_us.html #container');

关于 UTF-8 编码,不要忘记确保文件已经真正以 UTF-8 编码保存。使用编辑器的相应选项(在记事本中选择“另存为”,然后选择编码为“UTF-8”,而不是“ANSI”)。

0
在我的情况下,直到我放置了

,这两个解决方案都没有起作用。
header('Content-type: text/html; charset=utf-8');

0

请确保您的所有文件都保存为UTF-8(或UTF-8 w.o. BOM)格式。

如果您是通过FTP或网络工具上传的,请检查它们是否仍然是UTF-8格式。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接