本帖最后由 Clement_cc 于 2013-11-26 15:49:13 编辑

解决方案 »

  1.   

    那是当然的,你没看到 29 行的 $c = $str[$i].$str[$i+1]; 是以一个汉字两个字节计算的吗?
    他的算法太过复杂,完全没那个必要
    echo GetPinyin('为嘛我下载了一个');
    echo GetPinyin('但是pinyin-utf8.dat就不正常呢');function GetPinyin($txt) {
      static $dict;
      if(empty($dict)) {
        $fn = 'pinyin.dat';
        foreach(file($fn) as $r) {
          $t = explode('`', trim($r));
          $dict[$t[0]] = $t[1];
        }
      }  for($i=0; $i<iconv_strlen($txt, 'gbk'); $i++) {
        $ch = iconv_substr($txt, $i, 1, 'gbk');
        $res[] = $ch;
        if(isset($dict[$ch])) $res[]= $dict[$ch];
      }
      return join(' ', $res);
    }这个很简单的,要 utf-8 就将 pinyin.dat 另存为 utf-8 的
    并将代码中的 gbk 字样改成 utf-8 就可以了函数中使用了静态变量缓存字典
    在一个程序里,无论你执行多少次 GetPinyin,字典是会加载一次
    功能简陋,有待你自己扩充不过 6763 的汉字数只是 gb2312 的规模
    而 gbk 有两万七千多汉字呢