关于utf-8编码,熟悉的进来给指导下!~急
看了php手册,php得utf8_encode对中文是4字节编码,而java,windows等编码都采用3字节编码,java那边对于php这边的4字节编码可以解析,而php这边对于3字节的编码无法正确解析。。。怎么办?(必须用utf8编码交互的话) 问题点数:50、回复次数:15Top
1 楼helloyou0(你好!)回复于 2005-08-05 09:23:51 得分 0
utf8里中文应该大部分都是3字节啊Top
2 楼yh801216(艾奥利斯)回复于 2005-08-05 09:31:03 得分 0
utf8里中文应该大部分都是3字节啊???...php??怎么转码的?
Top
3 楼hjmsolar(孤舟蓑笠翁)回复于 2005-08-05 09:33:30 得分 0
如果是utf-8的话,strlen('字')==3;
怎么是等于4???Top
4 楼xuzuning(唠叨)回复于 2005-08-05 09:43:11 得分 10
utf8_encode不能处理中文!
utf8_encode
(PHP 3 >= 3.0.6, PHP 4, PHP 5)
utf8_encode -- 将 ISO-8859-1 编码的字符串转换为 UTF-8 编码
——————
描述
string utf8_encode ( string data )
该函数将 data 字符串转换为 UTF-8 编码,并返回编码后的字符串。UTF-8 是一种用于将宽字符值转换为字节流的 Unicode 的标准机制。UTF-8 对于纯 ASCII 字符来说是透明的,且是自同步的(也就是说这使得程序能够得知字符从字节流的何处开始),并可被普通字符串比较函数用以比较等操作。PHP 可将 UTF-8 编码为多达四个字节的字符,如:
表格 1. UTF-8 编码
字节(bytes) 位(bits) 表 示
1 7 0bbbbbbb
2 11 110bbbbb 10bbbbbb
3 16 1110bbbb 10bbbbbb 10bbbbbb
4 21 11110bbb 10bbbbbb 10bbbbbb 10bbbbbb
每个 UTF-8 表示一个能被用以储存字符数据的位。
Top
5 楼lm92()回复于 2005-08-05 09:53:49 得分 15
可使用iconv函数,参见
http://cn.php.net/manual/zh/function.iconv.phpTop
6 楼yh801216(艾奥利斯)回复于 2005-08-05 10:33:47 得分 0
谢谢,初步测试可以了。再看看Top
7 楼yh801216(艾奥利斯)回复于 2005-08-05 10:58:20 得分 0
另外,iconv(input_charset,output_charset,str);
这里的input_charset如何确定?
iconv_get_encoding获得的3个参数全部都是iso-8859-1,但是实际上是gb2312(我用的editplus2编辑器,它的默认字符编码好像就是gb2312).
那么我如何在程序中确定前面这个参数呢?如果需要限制编辑器那不是很惨?。。。Top
8 楼lm92()回复于 2005-08-05 11:09:57 得分 0
用多字节处理函数库中的mb_detect_encoding,这个和iconv一样,需要服务器加载扩展才能支持
http://cn.php.net/manual/zh/function.mb-detect-encoding.phpTop
9 楼gu1dai(异域苍穹.百年飞行)回复于 2005-08-05 12:15:14 得分 5
请看mb_convert_encoding的,这个需要mb_string库的支持
<?php
/* Convert internal character encoding to SJIS */
$str = mb_convert_encoding($str, "SJIS");
/* Convert EUC-JP to UTF-7 */
$str = mb_convert_encoding($str, "UTF-7", "EUC-JP");
/* Auto detect encoding from JIS, eucjp-win, sjis-win, then convert str to UCS-2LE */
$str = mb_convert_encoding($str, "UCS-2LE", "JIS, eucjp-win, sjis-win");
/* "auto" is expanded to "ASCII,JIS,UTF-8,EUC-JP,SJIS" */
$str = mb_convert_encoding($str, "EUC-JP", "auto");
?>Top
10 楼netvt(唯她(为了泡老婆,努力学习LISP))回复于 2005-08-05 12:50:24 得分 10
参见:
http://community.csdn.net/Expert/TopicView1.asp?id=4175715
http://community.csdn.net/Expert/TopicView.asp?id=4168183Top
11 楼yh801216(艾奥利斯)回复于 2005-08-05 14:49:33 得分 0
嗯,明白不少,
再问个问题哈,
之前我用utf8_encode编码中文时得到的是4字节编码,我用php的utf8_decode解码输出正确中文,这个不难理解,
传给java程序,它那边ISO-8859-1 => GBK(随便一种,只要浏览器支持的吧?),也能得到正常中文。。。这是怎么回事啊。。。Top
12 楼helloyou0(你好!)回复于 2005-08-05 22:51:19 得分 10
呵呵,研究了一下,应该是这样。
utf8_encode是如手册所说转iso-8859-1到utf8用的,那么你用来转gbk编码汉字,
比如,“我”字,它把它当作两个iso-8859-1的字符,chr(206)和chr(210),因为gbk
汉字编码是两个>128的字节组成的。
而这两个字符对应的utf8分别是2字节编码,所以你得到一个4字节编码,但是,其实它
不是汉字‘我’的utf8编码(应为11100110 10001000 10010001,3字节),而是两个
字符chr(206)和chr(210)的utf8编码(分别为11000011 10001110和 11000011 10010010 )
当时php中用utf8_decode时,它再还原成chr(206),chr(210),而你输出这两个字符时,
因为页面使用gbk编码,所以它们又合成了原来的汉字‘我’,
你传给java后,java一样的过程,iso-8859-1=》gbk变成chr(206),chr(210),然后显示成‘我’
根据这个判断,如果java中你使用其它编码,结果就会不对了,比如你可以试试iso-8859-1=>utf8,
因为两个utf8编码的chr(206),chr(210)不能合并成一个‘我’
Top
13 楼yh801216(艾奥利斯)回复于 2005-08-06 09:13:04 得分 0
嗯,谢谢!~Top
14 楼xylegend(pal)回复于 2005-08-06 19:30:30 得分 0
markTop
15 楼s_future()回复于 2006-01-15 14:34:42 得分 0
markTop




