【问题标题】:xmlHttpRequest displays eurosign as questionmarkxmlHttpRequest 将欧元符号显示为问号
【发布时间】:2011-11-10 18:21:18
【问题描述】:

我使用这个脚本(来自dynamicdrive)用id动态填充div:

    var bustcachevar=1 //bust potential caching of external pages after initial request? (1=yes, 0=no)
    var loadedobjects=""
    var rootdomain="http://"+window.location.hostname
    var bustcacheparameter=""

    function ajaxpage(url, containerid){
        var page_request = false
        if (window.XMLHttpRequest) // if Mozilla, Safari etc
        page_request = new XMLHttpRequest();
        else if (window.ActiveXObject){ // if IE
            try {
                page_request = new ActiveXObject("Msxml2.XMLHTTP");
                }
            catch (e){
                try{
                    page_request = new ActiveXObject("Microsoft.XMLHTTP");
                    }
                catch (e){}
            }
        }
        else
        return false
        page_request.onreadystatechange=function(){
            loadpage(page_request, containerid)
        }

        if (bustcachevar) //if bust caching of external page
        bustcacheparameter=(url.indexOf("?")!=-1)? "&"+new Date().getTime() : "?"+new Date().getTime()
        page_request.open('GET', url+bustcacheparameter, true)
        page_request.send(null)
    }

    function loadpage(page_request, containerid){
        if (page_request.readyState == 4 && (page_request.status==200 || window.location.href.indexOf("http")==-1))
        document.getElementById(containerid).innerHTML=page_request.responseText
    }

在我加载一个带有例如欧元符号的页面之前,一切正常。 代码页在页面上设置正确,但显示一个问号。 我没有足够的 javascript 来解决这个问题。

提前感谢您的任何建议!

注意:感谢朋友,我现在知道使用此脚本以 UTF-8 格式保存要加载的文件可以解决问题。但我不能确定我加载的每个页面都是 UTF-8 编码的,所以我的问题是:

脚本有没有办法设置正确的字符集?有没有办法让脚本适应你要加载的文件的代码页?

【问题讨论】:

  • 我看不出它怎么可能是一个 JavaScript 问题。很可能,您在服务器端 AJAX 脚本和目标 HTML 文档(或可能依赖默认编码)这两个文档中使用了不同的编码。

标签: javascript ajax dynamic xmlhttprequest euro


【解决方案1】:

您似乎在某个地方遇到了编码问题。

我强烈建议您在任何地方都使用 UTF-8,因为它是网络的既定标准。检查执行 ajax 调用的页面和动态加载的页面是否以 UTF-8 编码并由服务器以正确的标头发送(标头应包含 Content-type: text/html; charset=UTF-8 之类的内容)。

此外,最好的做法是在 html 页面中用它们的 html 友好代码替换外来字符以避免此类问题。使用€ 支付€。

【讨论】:

  • 感谢您的回复。我知道标准,正如我在问题中所指出的,对源文件进行编码确实可以解决问题。有没有办法让 javascript 设置编码或更改/适应正在读取的文件?发生问题时,该文件曾经是 ANSI 编码而不是 UTF-8。我希望能够以不同的字符集加载页面,因为我不是唯一一个上传可以动态加载的文件的人。用户可能不知道如何将文件保存为 UTF-8,他们不应该关心(因为您必须假设用户是愚蠢的)。
  • 您是否建议同时使用 UTF-8 和避免使用非 ASCII 字符?
  • @Álvaro G. Vicario No :) 我知道如果没有非 ASCII 字符,我们并不真正关心编码......
  • 我认为这不太实用...用户可以上传ANSI格式的文件,其中使用特殊字符。现在使用这个脚本是个问题。
【解决方案2】:

这是我的假设(我认为您的更新已经证实了这一点):

  • 当您编写正在加载的远程文档时,您只需打开编辑器,点击键盘上的 € 符号并保存即可。由于您从未选择任何编码,因此您的编辑器使用了 ANSI 代码页。这就是问题所在:ANSI 代码页基本上取决于您的居住地。在西欧,Win-1252 是一种流行的选择,它将欧元符号编码为0x80

  • 当您编写要插入的目标 HTML 文档时,您执行的操作完全相同,并获得一个 Win-1252 文档。但是,网络服务器不知道编码是什么。很多时候,它会默认为 ISO-8859-1 之类的东西,而 ISO-8859-1 甚至没有欧元符号!

  • JavaScript 读取 0x80 并写入 0x80

  • 浏览器在一个假定为 ISO-8859-1 的 HTML 文档中找到 0x80。在这样的编码中,0x80 实际上是空白的。

因此您不必修复 JavaScript 代码(那里没有什么可修复的,主要是因为那里没有任何问题)。您需要找出您网站的编码是什么,并生成实际使用这种编码的文件(高级编辑器会让您选择)。

【讨论】:

  • 您好,感谢您的回复。事情就是这样发生的。即使当我在 index.php 中指定我想要说具有欧元符号的 ISO-8859-15 或 WIN-1252 时,我仍然得到问号而不是欧元符号。这意味着我使用什么代码页来设置我的 index.php 文件并不重要。这一切都取决于我在使用 javascript 加载的文件上使用的编码。例如,假设有人将错误的基于字符代码的文件上传到我的服务器并使用此脚本加载它,是否有某种方式可以检查代码页并以某种方式“转换”它?
  • 没有一种 100% 可靠的方法来检测随机用户上传的任意文本文件的编码。为什么不简单地使用 textarea 构建一个上传功能?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-27
  • 2011-10-12
  • 1970-01-01
  • 1970-01-01
  • 2012-08-11
  • 2017-07-19
相关资源
最近更新 更多