utf8里中文应该大部分都是3字节啊

解决方案 »

  1.   

    utf8里中文应该大部分都是3字节啊???...php??怎么转码的?
      

  2.   

    如果是utf-8的话,strlen('字')==3;
    怎么是等于4???
      

  3.   

    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 表示一个能被用以储存字符数据的位。 
      

  4.   

    可使用iconv函数,参见
    http://cn.php.net/manual/zh/function.iconv.php
      

  5.   

    另外,iconv(input_charset,output_charset,str);
    这里的input_charset如何确定?
    iconv_get_encoding获得的3个参数全部都是iso-8859-1,但是实际上是gb2312(我用的editplus2编辑器,它的默认字符编码好像就是gb2312).
    那么我如何在程序中确定前面这个参数呢?如果需要限制编辑器那不是很惨?
      

  6.   

    用多字节处理函数库中的mb_detect_encoding,这个和iconv一样,需要服务器加载扩展才能支持
    http://cn.php.net/manual/zh/function.mb-detect-encoding.php
      

  7.   

    请看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");
    ?>
      

  8.   

    参见:
    http://community.csdn.net/Expert/TopicView1.asp?id=4175715
    http://community.csdn.net/Expert/TopicView.asp?id=4168183
      

  9.   

    嗯,明白不少,
    再问个问题哈,
    之前我用utf8_encode编码中文时得到的是4字节编码,我用php的utf8_decode解码输出正确中文,这个不难理解,
    传给java程序,它那边ISO-8859-1 => GBK(随便一种,只要浏览器支持的吧?),也能得到正常中文这是怎么回事啊
      

  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)不能合并成一个‘我’