【问题标题】:XMLHttpRequest with Hebrew Characters带有希伯来字符的 XMLHttpRequest
【发布时间】:2012-12-15 21:08:55
【问题描述】:

XMLHttpRequest 中的文本包含希伯来字符时,我的这段代码似乎搞砸了,所以我做了一个小例子来演示这个问题。

小代码示例加载页面,然后将 div 的内容替换为从服务器获取的内容。 既然调用的是同一个网页,那么它应该用相同的内容替换它。

当 div 内的按钮包含英文字母时,代码可以正常工作,但如果字母超出 ASCII 127,则它会拧紧按钮。

我做了一些测试,发现如果我将文件保存为 Unicode,那么它可以正常工作... 问题是我无法将此文件保存为 Unicode,因为它:

  1. 文件大小加倍
  2. 将部分数据写入该 html 文件的硬件,以 ASCII 格式写入

这个小例子只是自己加载:

<HTML><HEAD><TITLE>Test</TITLE>
</HEAD>
<BODY onload="readPage()">
<Div id='Hello'>
<Button>שלום</Button>
</Div>
<Script>
var xmlHttp;
function readPage()
{
    xmlHttp=GetXmlHttpObject();

    if (xmlHttp==null)
    {
        alert ("Your browser does not support AJAX!");
        return;
    }

    var url="/xampp/2.html?dummy=" + new Date().getTime();
    xmlHttp.onreadystatechange=stateChanged;
    xmlHttp.open("GET",url, true);
    xmlHttp.setRequestHeader("Content-Type", "text/plain;charset=ISO-8859-1");
    xmlHttp.setRequestHeader("Accept-Charset", "ISO-8859-1");
    xmlHttp.send(null);
}

function stateChanged()
{
    if (xmlHttp.readyState==4)
    {
        var x = ""; 
        //alert(xmlHttp.responseXML);
        //alert(xmlHttp.responseText);
        if (xmlHttp.responseText.match(/<Div id='Hello'>([\s\S]*?)<\/Div>/i))
        {
            x = xmlHttp.responseText.match(/<Div id='Hello'>([\s\S]*?)<\/Div>/i)[1];
            //x = x.replace(/"/g,'');


            var pdata= document.all ? document.all["Hello"] :
                document.getElementById("Hello");

            alert(pdata.innerHTML);
            alert(x);
            pdata.innerHTML=x;
            alert(pdata.innerHTML);
        }

    }
}
function GetXmlHttpObject()
{
    var xmlHttp=null;
    try
    {
        // Firefox, Opera 8.0+, Safari
        xmlHttp=new XMLHttpRequest();
    }
    catch (e)
    {
        // Internet Explorer
        try
        {
            xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");
        }
        catch (e)
        {
            xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
        }
    }
    return xmlHttp;
}
</Script>
</BODY></HTML>

我尝试更改字符集和内容类型,但不起作用。

我做错了什么?

(顺便说一句,我不能使用任何 jQuery 的东西)。

谢谢。

【问题讨论】:

  • 为什么你不想使用 UTF-8?
  • 你不能同时拥有它 - 希伯来字符总是在 ASCII 之外。您需要在这些字符合法的情况下使用某种编码(例如iso-8859-8)。如果您的文件是 ASCII,则不能包含希伯来字符。
  • 请解释一下“拧紧按钮”是什么意思?你遇到了什么错误?
  • @pomaxa - OP 在问题中解释。无论是文件大小,还是因为在文件中生成某些内容的过程只会产生 ASCII。

标签: javascript html ajax xmlhttprequest hebrew


【解决方案1】:

您可以尝试手动对字母进行编码。这是一个非常缓慢和糟糕的解决方案,但它可能会对您有所帮助 q 包含希伯来语数据 (在 javascript 上)

q=q.replace(/א/gi,"%E0");
q=q.replace(/ב/gi,"%E1");
q=q.replace(/ג/gi,"%E2");
q=q.replace(/ד/gi,"%E3");
q=q.replace(/ה/gi,"%E4");
q=q.replace(/ו/gi,"%E5");
q=q.replace(/ז/gi,"%E6");
q=q.replace(/ח/gi,"%E7");
q=q.replace(/ט/gi,"%E8");
q=q.replace(/י/gi,"%E9");
q=q.replace(/כ/gi,"%EB");
q=q.replace(/ך/gi,"%EA");
q=q.replace(/ל/gi,"%EC");
q=q.replace(/מ/gi,"%EE");
q=q.replace(/ם/gi,"%ED");
q=q.replace(/נ/gi,"%F0");
q=q.replace(/ן/gi,"%EF");
q=q.replace(/ס/gi,"%F1");
q=q.replace(/ע/gi,"%F2");
q=q.replace(/פ/gi,"%F4");
q=q.replace(/ף/gi,"%F3");
q=q.replace(/צ/gi,"%F6");
q=q.replace(/ץ/gi,"%F5");
q=q.replace(/ק/gi,"%F7");
q=q.replace(/ר/gi,"%F8");
q=q.replace(/ש/gi,"%F9");
q=q.replace(/ת/gi,"%FA");

【讨论】:

  • 嗯,它不仅仅是希伯来语,而是不可打印的 ascii 代码中的任何字符。问题是 responseText 已经“损坏”了。这就是我在消息框中提醒它的原因......我看到它已经错了。这就像 XMLHttpRequest 不适用于这些字符。
【解决方案2】:

好的,我不确定 XAMPP 的 Web 服务器为我使用的特定 HTML 发送什么,但在特定硬件上,我们编写了 Web 服务器并发送:

HTTP/1.1 200 OK
MIME-version: 1.0
Content-Type: text/html
Content-length: 11280
Proxy-Connection: Keep-Alive
Connection: Keep-Alive
Age: 0

一种解决方案是将网页保存为 Unicode,这对我们不利。 另一个似乎可行的选项是告诉浏览器我们需要特定的编码。 在本例中为 Windows-1255。

我所要做的就是更改从网站发送的标题,使其也包含字符集,现在它可以正常工作了:

HTTP/1.1 200 OK
MIME-version: 1.0
Content-Type: text/html; charset=Windows-1255
Content-length: 11280
Proxy-Connection: Keep-Alive
Connection: Keep-Alive
Age: 0

【讨论】:

    猜你喜欢
    • 2012-02-03
    • 2018-01-24
    • 2014-10-24
    • 2014-12-14
    • 1970-01-01
    • 1970-01-01
    • 2015-12-11
    • 1970-01-01
    • 2020-03-07
    相关资源
    最近更新 更多