以开发报表软件FineReport为例,在给报表服务器发送请求之前,对URL或者只对URL里面的参数名字和参数值,进行cjkEncode的编码,该方式兼容了各种不同的字符集,如ISO8859-1、 UTF-8、 GBK、 ENU_JP,尤其对中日韩文的处理采取了统一的方案。
js 只可以解析 utf-8 的url中文字符编码。如果浏览器页面是 chrset=gbk 编码,那么经过 解析后 浏览器应该会自动把utf-8的字符转换gbk,所以在 浏览器端 就不需要 utf-8 编码在转成 gbk 了。
看看我们用到的函数:
php函数:
urlencode 这个函数是进行url编码的
iconv 这个函数是把 gbk编码 转换成 utf-8编码 ,因为js只能解释 utf-8编码
js函数:
unes cape 这个函数是 解码 utf-8编码的 ,解码后依然是utf-8 字集 , 但是浏览器会根据head charset自动转换成gbk编码, 这样js里就可以不用 php 中iconv 再次转换了。
decodeURI 这个函数是 解码 url 编码的 ,它和php的 urlencode 对应 ,别纠结 url 和 uri 。但是 decodeURI 的参数必须是 utf-8编码 , 所以 php 用iconv 转换了 。
下面上案例,就简单的 两个 例句 :
php的:
<?php
header("Content-Type:text/htmlcharset=gbk2312")
$arr=array("one"=>"如果在这里改变", "two"=>"2222222222", "three"=>"3333333")
$arr["one"] = urlencode(iconv("gbk","utf-8",$arr["one"]))
echo json_encode($arr)
===========================================================================================
js的 :
<script>
function createAjax(){
var request=false
//window对象中有XMLHttpRequest存在就是非IE,包括(IE7,IE8)
if(window.XMLHttpRequest){
request=new XMLHttpRequest()
if(request.overrideMimeType){
request.overrideMimeType("text/xml")
}
//window对象中有ActiveXObject属性存在就是IE
}else if(window.ActiveXObject){
var versions=['Microsoft.XMLHTTP', 'MSXML.XMLHTTP', 'Msxml2.XMLHTTP.7.0','Msxml2.XMLHTTP.6.0','Msxml2.XMLHTTP.5.0', 'Msxml2.XMLHTTP.4.0', 'MSXML2.XMLHTTP.3.0', 'MSXML2.XMLHTTP']
for(var i=0i<versions.lengthi++){
try{
request=new ActiveXObject(versions[i])
if(request){
return request
}
}catch(e){
request=false
}
}
}
return request
}
//注意: 要每次请求都要使用一个新的XMLHttpRequest
var ajax=null
function show(){
var helloobj=document.getElementById("hello")
ajax=createAjax()
ajax.onreadystatechange=function(){
if(ajax.readyState==4){
if(ajax.status==200){
eval_r("var rtext="+ajax.responseText)
helloobj.innerHTML=unes cape(decodeURI(rtext.one))
}else{
alert()
}
}
}
ajax.open("get", "server.php", true)
ajax.send()
}
</script>
<input type="button" onclick="show()" value="request">
<div style="width:500pxheight:200pxbackground:yellow" id="hello">
</div>