1、去掉头:header("Content-type: text/html; charset=utf-8");
让浏览器自己识别语言编码
2、你传送的数据不是 utf-8 编码的!自然要出错啦
/**
* 函数 is_utf8
* 功能 检查传入的串是否为utf-8编码串
* 返回 逻辑,是 true,不是 false
**/
if(! function_exists('is_utf8')):
function is_utf8($s) {
if(preg_match('/^(?:[\x00-\x7f]|[\xc0-\xff][\x80-\xbf]+)+$/', $s)) {
return true;
}
return false;
}
endif;3、你的 $data 长度为59字节,每个双字节字符的utf-8编码一般为3个字节长
让浏览器自己识别语言编码
2、你传送的数据不是 utf-8 编码的!自然要出错啦
/**
* 函数 is_utf8
* 功能 检查传入的串是否为utf-8编码串
* 返回 逻辑,是 true,不是 false
**/
if(! function_exists('is_utf8')):
function is_utf8($s) {
if(preg_match('/^(?:[\x00-\x7f]|[\xc0-\xff][\x80-\xbf]+)+$/', $s)) {
return true;
}
return false;
}
endif;3、你的 $data 长度为59字节,每个双字节字符的utf-8编码一般为3个字节长
utf8 是四位16进制码所以GB码转成UTF8的话每个字符会加两个码位如果是二进制流的话转换就会有问题,出现乱码
明摆着编码就是错的,关键是,即使是错的也要正常显示输入框
总不能因为数据是错的,而破坏整个输入框吧<input name=test value="$data "> 这样的是可以正常显示的
<input name=test value="$data"> 这样的就不行了
但即使是乱码也必须要在 input 里显示出来
如果你声明了 charset=utf-8 ,那么浏览器就会认为传给他的是 utf-8 编码的内容,而你实际上的不是.所以无法得到正确结果
只要你不去声明页面语言,浏览器就会自动的识别只要去掉 header("Content-type: text/html; charset=utf-8");
就ok啦
我要求的就是输出成 utf8 的文字错就错了,数据完整性不考虑考虑的是要显示出来,哪怕他是错的,也要把错的显示出来
虽然最后一个字符有问题,但我并不认为是异常字符。
异常字符只可能是双引号 " 吧,欢迎继续拍砖。
可能是你浏览器有问题
自然就显示不出来。
你前面发出的HEADER只是强制把编码设置为UTF-8.
可这个赶奔就不是UTF8
因为你这些字符中间有一个双引号。
你试试看。
$data= chr(227) . chr(130) . chr(171) . chr(227) . chr(130) . chr(166) . chr(131) . chr(145) . chr(227) . chr(131) . chr(145) . chr(227);echo "<input name=test value=\"$data \">";echo "<input name=test value=\"$data\">";
正常显示在IE6下显示,出现源码
<input name=test value="カウントダウンソリューション)で難解なパ㢾
将双引号改为单引号后
正常显示
IE和firefox均正常显示看来还是转码时引号问题
echo "<input name=test value=\'$data\'>";
都有输入框但IE下框内显示\'カウントダウンソリューション)で難解なパ㜧
但firefox下框内显示
\'カウントダウンソリューション)で難解なパ?\'没有其他办法。如果能给变量$data先转为UTF8就好了
xuzuning(唠叨)的方法是一种思路:实际上,这是个转码问题。但在输出时却没有进行转码加空格是一种办法!chr(),输出的是ASCII码,8位码,而UTF8是4个16进制码,当要输出UTF8时,码位就乱了,所有有乱码!ASCII 转成UTF8 要进行补位!正常情况下,是要内码转换的!除非系统自动识别!所以,加空格可能是一种补位操作,你可多加几个空格看看!一般情况下,不会出现这个问题!因为,如果从网页输入,可以是UTF8或GBK,直接入数据库,可以进行转换!实质是在进入数据库时已进了了转码,出库时也时了转码!不会有问题!