关于编码的若干问题 | 牧天的酒吧

关于编码的若干问题

2017-03-08 17:21:00 于 技术

1、使用xftp连接服务器,中文文件显示为乱码

此种情况一般出现在windows系统客户端连接linux系统的服务器,服务器默认编码格式为utf-8。

设置xftp的会话属性,在选项卡中,勾选“使用UTF-8编码”。刷新界面,汉字乱码消失。

2、PHP下的编码转换

mb_convert_encoding和iconv两个函数都可以用。


string mb_convert_encoding ( string str, string to_encoding [, mixed from_encoding] )

str,要转换编码的字符串

to_encoding ,目标编码,如utf-8,gbk,大小写均可

from_encoding,原编码,如utf-8,gbk,大小写均可

mb_convert_encoding($str, "UTF-8", "auto"); //未知原编码,通过auto自动检测后,转换编码为utf-8

使用mb_convert_encoding需要先enable mbstring 扩展库,在 php.ini里将; extension=php_mbstring.dll 前面的 ; 去掉 。

mb_convert_encoding 可以指定多种输入编码,它会根据内容自动识别,但是执行效率比iconv差太多;


string iconv ( string in_charset, string out_charset, string str )

//把gb2312换为utf-8

$content = iconv("gb2312","utf-8//IGNORE",$content);

注意:第二个参数,除了可以指定要转化到的编码以外,还可以增加两个后缀://TRANSLIT 和 //IGNORE,其中 //TRANSLIT 会自动将不能直接转化的字符变成一个或多个近似的字符,//IGNORE 会忽略掉不能转化的字符,而默认效果是从第一个非法字符截断。

Returns the converted string or FALSE on failure。

一般情况下用iconv,只有当遇到无法确定原编码是何种编码,或者iconv转化后无法正常显示时才用mb_convert_encoding函数。

在php程序中使用mb_convert_encoding()方法进行字符编码转换大家都很熟悉了,平时也在大量的使用。而且在一般情况下该方法也表现的足够好,值得表扬。但在一个项目中我们需要使用它进行UTF8到GBK的转换,在转换一些特殊字符时发现了一个不大不小的问题。具体表现为mb把在utf8可编码的字符而在gbk中不可编码的字符都转成了0x000x80,这样就导致转换后的gbk字符是有问题的。

在我们的意识中,在进行字符编码转换的过程中,如果遇到目标编码不可表现的字符,转码程序应该做的是舍弃这种字符,这样虽然丢失了部分数据,但不会导致转码的字符序列不可用。不清楚mb为什么要使用上述方式而不是舍弃方式。

临时的解决方式是对转码后的字符串序列进行过滤,过滤掉所有x0080的字符;又或者在转义之前对utf8的字符串进行过滤,过滤掉ut8可表示而gbk不可表示的所有字符,从实现难度上来讲,第一种过滤方式比较容易做到。

3、PHP中使用pclzip插件解压中文文件

如果服务器端的编码为utf-8,如linux服务器的apache,则需要进行如下的编码转换:

if ($p_path != '') {
  $p_entry['filename'] = $p_path."/".$p_entry['filename'];
  $encode = mb_detect_encoding($p_entry['filename'], array('ASCII','GB2312','GBK','UTF-8'));
  if($encode !== 'UTF-8'){
    $p_entry['filename'] = mb_convert_encoding($p_entry['filename'], 'utf-8', $encode);
  }
}

如果服务器端的编码为gb2313,如windows服务器的IIS,则需要进行如下的编码转换:

if ($p_path != '') {
  $p_entry['filename'] = $p_path."/".$p_entry['filename'];
  $encode = mb_detect_encoding($p_entry['filename'], array('ASCII','GB2312','GBK','UTF-8'));
  if($encode !== 'ASCII' && $encode !== 'EUC-CN'){
    $p_entry['filename'] = mb_convert_encoding($p_entry['filename'], 'gb2312', 'UTF-8');
  }
}

以上两种处理的前提是web程序提交数据的编码为utf-8格式。

4、PHP上传中文文件的编码问题

主要处理中文路径及文件名。

回主页