本文发表在 rolia.net 枫下论坛编码问题很复杂,从最基础说起:
>wget -d wenxuecity.com (-d表示debug,显示详细信息)
HTTP request sent, awaiting response... HTTP/1.1 200 OK
Date: Wed, 07 Dec 2005 20:54:35 GMT
Server: Apache/1.3.33 (Unix) PHP/4.3.11
X-Powered-By: PHP/4.3.11
Connection: close
Content-Type: text/html; charset=gb2312
最后一行就表示,服务器通知浏览器,这里发出的编码将是GB2312。
但是在发出来的文档中,很有可能存在<META HTTP-EQUIV=Content-Type CONTENT='text/html; charset=GBK'>的字样。
浏览器本身也有两个编码:1,系统本身的语言,是中文还是英文系统?2,浏览器的缺省配置。比如说Internet Option中的Language Options。有些电脑访问cnn.com的时候总出现中文的句号、逗号,还吃了下一个字母,就是因为它企图用中文来显示。
所以,现在有4个编码:服务器偷偷发出的文件头中的编码;HTML头的编码;客户端系统的编码和客户端浏览器的编码。如果这几个编码不一致,浏览器会用哪个来显示,取决于各个浏览器。所以Firefox/Opera/IE表现不一样。
在你的问题中,还多了一个编码:浏览器用XMLHTTPRequest从服务器读过来的时候,按你说的是UTF-8编码。
下面一段是从GB2312转成UTF-8的js程序:
// Encode to UTF8. CC ben@fadshop.net
function EncodeUtf8(s1)
{
var s = escape(s1);
var sa = s.split("%");
var retV ="";
if(sa[0] != "")
{
retV = sa[0];
}
for(var i = 1; i < sa.length; i ++)
{
if(sa[i].substring(0,1) == "u")
{
retV += Hex2Utf8(Str2Hex(sa[i].substring(1,5)));
}
else retV += "%" + sa[i];
}
return retV;
}
function Str2Hex(s)
{
var c = "";
var n;
var ss = "0123456789ABCDEF";
var digS = "";
for(var i = 0; i < s.length; i ++)
{
c = s.charAt(i);
n = ss.indexOf(c);
digS += Dec2Dig(eval(n));
}
//return value;
return digS;
}
function Dec2Dig(n1)
{
var s = "";
var n2 = 0;
for(var i = 0; i < 4; i++)
{
n2 = Math.pow(2,3 - i);
if(n1 >= n2)
{
s += '1';
n1 = n1 - n2;
}
else
s += '0';
}
return s;
}
function Dig2Dec(s)
{
var retV = 0;
if(s.length == 4)
{
for(var i = 0; i < 4; i ++)
{
retV += eval(s.charAt(i)) * Math.pow(2, 3 - i);
}
return retV;
}
return -1;
}
function Hex2Utf8(s)
{
var retS = "";
var tempS = "";
var ss = "";
if(s.length == 16)
{
tempS = "1110" + s.substring(0, 4);
tempS += "10" + s.substring(4, 10);
tempS += "10" + s.substring(10,16);
var sss = "0123456789ABCDEF";
for(var i = 0; i < 3; i ++)
{
retS += "%";
ss = tempS.substring(i * 8, (eval(i)+1)*8);
retS += sss.charAt(Dig2Dec(ss.substring(0,4)));
retS += sss.charAt(Dig2Dec(ss.substring(4,8)));
}
return retS;
}
return "";
}
我印象中只有二三十行,现在才发现EncodeUtf8函数很短,但是还接着好几个辅助函数.你看能不能把它decode出来。更多精彩文章及讨论,请光临枫下论坛 rolia.net
>wget -d wenxuecity.com (-d表示debug,显示详细信息)
HTTP request sent, awaiting response... HTTP/1.1 200 OK
Date: Wed, 07 Dec 2005 20:54:35 GMT
Server: Apache/1.3.33 (Unix) PHP/4.3.11
X-Powered-By: PHP/4.3.11
Connection: close
Content-Type: text/html; charset=gb2312
最后一行就表示,服务器通知浏览器,这里发出的编码将是GB2312。
但是在发出来的文档中,很有可能存在<META HTTP-EQUIV=Content-Type CONTENT='text/html; charset=GBK'>的字样。
浏览器本身也有两个编码:1,系统本身的语言,是中文还是英文系统?2,浏览器的缺省配置。比如说Internet Option中的Language Options。有些电脑访问cnn.com的时候总出现中文的句号、逗号,还吃了下一个字母,就是因为它企图用中文来显示。
所以,现在有4个编码:服务器偷偷发出的文件头中的编码;HTML头的编码;客户端系统的编码和客户端浏览器的编码。如果这几个编码不一致,浏览器会用哪个来显示,取决于各个浏览器。所以Firefox/Opera/IE表现不一样。
在你的问题中,还多了一个编码:浏览器用XMLHTTPRequest从服务器读过来的时候,按你说的是UTF-8编码。
下面一段是从GB2312转成UTF-8的js程序:
// Encode to UTF8. CC ben@fadshop.net
function EncodeUtf8(s1)
{
var s = escape(s1);
var sa = s.split("%");
var retV ="";
if(sa[0] != "")
{
retV = sa[0];
}
for(var i = 1; i < sa.length; i ++)
{
if(sa[i].substring(0,1) == "u")
{
retV += Hex2Utf8(Str2Hex(sa[i].substring(1,5)));
}
else retV += "%" + sa[i];
}
return retV;
}
function Str2Hex(s)
{
var c = "";
var n;
var ss = "0123456789ABCDEF";
var digS = "";
for(var i = 0; i < s.length; i ++)
{
c = s.charAt(i);
n = ss.indexOf(c);
digS += Dec2Dig(eval(n));
}
//return value;
return digS;
}
function Dec2Dig(n1)
{
var s = "";
var n2 = 0;
for(var i = 0; i < 4; i++)
{
n2 = Math.pow(2,3 - i);
if(n1 >= n2)
{
s += '1';
n1 = n1 - n2;
}
else
s += '0';
}
return s;
}
function Dig2Dec(s)
{
var retV = 0;
if(s.length == 4)
{
for(var i = 0; i < 4; i ++)
{
retV += eval(s.charAt(i)) * Math.pow(2, 3 - i);
}
return retV;
}
return -1;
}
function Hex2Utf8(s)
{
var retS = "";
var tempS = "";
var ss = "";
if(s.length == 16)
{
tempS = "1110" + s.substring(0, 4);
tempS += "10" + s.substring(4, 10);
tempS += "10" + s.substring(10,16);
var sss = "0123456789ABCDEF";
for(var i = 0; i < 3; i ++)
{
retS += "%";
ss = tempS.substring(i * 8, (eval(i)+1)*8);
retS += sss.charAt(Dig2Dec(ss.substring(0,4)));
retS += sss.charAt(Dig2Dec(ss.substring(4,8)));
}
return retS;
}
return "";
}
我印象中只有二三十行,现在才发现EncodeUtf8函数很短,但是还接着好几个辅助函数.你看能不能把它decode出来。更多精彩文章及讨论,请光临枫下论坛 rolia.net