免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 5104 | 回复: 12
打印 上一主题 下一主题

半个汉字变问号,求解决办法. [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2003-06-06 21:27 |只看该作者 |倒序浏览
一句话中截取一部分,则有可能会出现半个汉字,则显示为问号.
若全是汉字,则可截取偶数字节,但有可以有标点符号,空格之类的就不好办了,求解决办法.

论坛徽章:
0
2 [报告]
发表于 2003-06-07 00:31 |只看该作者

半个汉字变问号,求解决办法.

这个问题我以前也遇到过,不过最后采取了再加一个字段放摘要的办法 ,还是没解决啊

论坛徽章:
1
技术图书徽章
日期:2013-12-05 23:25:45
3 [报告]
发表于 2003-06-07 10:36 |只看该作者

半个汉字变问号,求解决办法.

其实是有办法的,不过比较的笨啊。

思路如下:
1、确定截取长度 ln , 和中文字符标志 ck(ck=0)
2、从开头开始逐个读取字符,如果其ord>;0xa0,那么设置ck++,读取直到ln
3、如果ck为奇数,那么读取ln+1或者ln-1个字符,否则读取ln个字符

论坛徽章:
0
4 [报告]
发表于 2003-06-09 08:51 |只看该作者

半个汉字变问号,求解决办法.

原帖由 "snowall" 发表:
一句话中截取一部分,则有可能会出现半个汉字,则显示为问号.
若全是汉字,则可截取偶数字节,但有可以有标点符号,空格之类的就不好办了,求解决办法.
   

/**
* 截取中文部分字符串
*
* 截取指定字符串指定长度的函数,该函数可自动判定中英文,不会出现乱码
*
* @access public
* @param string    $str    要处理的字符串
* @param int       $strlen 要截取的长度默认为10
* @param string    $other  是否要加上省略号,默认会加上
* @return string
*/
function showtitle($str,$strlen=10,$other=true) {
    for($i=0;$i<$strlen;$i++)
      if(ord(substr($str,$i,1))>;0xa0) $j++;
    if($j%2!=0) $strlen++;
    $rstr=substr($str,0,$strlen);
    if (strlen($str)>;$strlen && $other) {$rstr.='...';}
    return $rstr;
}

论坛徽章:
0
5 [报告]
发表于 2003-06-13 17:17 |只看该作者

半个汉字变问号,求解决办法.

我也做了一个,用于显示文件名

        $tmp_maxlen=22;
        if (strlen($tmp_file)>;$tmp_maxlen){
                $i=0;
                $ii=0;
                while ($i<strlen($tmp_file)){
                        if (ord(substr($tmp_file,$i,1))>;127){$ii++;}
                        if (($i>;=$tmp_maxlen-3)&&($ii%2==0)){
                                $tmp_dispname=substr($tmp_file,0,$i-1).'...';
                                break;
                        }
                        $i++;
                }
        }else{$tmp_dispname=$tmp_file;}

论坛徽章:
1
IT运维版块每日发帖之星
日期:2015-08-04 06:20:00
6 [报告]
发表于 2003-06-14 00:47 |只看该作者

半个汉字变问号,求解决办法.

  1. function mycopy($string,$num)//截取汉字字符串
  2. {
  3.     //2002-08-19
  4.     //注意:汉字第二位可能小于0xa0 !!
  5.     //如 朱镕基 镕字编码不规范;

  6.     if ($num>;strlen($string)) $num=strlen($string);
  7.     $j=0;
  8.     for($i=0;$i<$num;$i++){
  9.       if(ord(substr($string,$i,1))>;0xa0){
  10.          $j++;
  11.          if ($i<($num-1)){
  12.             $i++;
  13.             $j++;
  14.          }
  15.       }
  16.     }

  17.     if($j%2!=0) $num++;
  18.     $str=substr($string,0,$num);
  19.     return $str;
  20. }
复制代码

论坛徽章:
0
7 [报告]
发表于 2003-07-01 09:16 |只看该作者

半个汉字变问号,求解决办法.

我的方法:

  1. // 截取汉字文本串并保持汉字完整
  2. function mysubstr($str, $N) {
  3.         if (strlen($str) <= $N) return $str;
  4.        
  5.         $i = 0;
  6.         $tmp = "";
  7.         while ($i <= $N) {
  8.                 if (ord(substr($str,$i,1)) >; 127) {
  9.                         $tmp .= substr($str,$i,2);
  10.                         $i = $i + 2;
  11.                 } else {
  12.                         $tmp .= substr($str,$i,1);
  13.                         $i = $i + 1;
  14.                     }
  15.             }
  16.    
  17.         return $tmp;
  18. }
复制代码

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
8 [报告]
发表于 2003-07-01 17:31 |只看该作者

半个汉字变问号,求解决办法.

哈哈!!!!
开始我也打算和你们一样解决的,最后我发觉有Multi-Byte String Functions。
http://www.php.net/manual/en/ref.mbstring.php

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
9 [报告]
发表于 2003-07-01 18:03 |只看该作者

半个汉字变问号,求解决办法.


  1. <?php
  2. $test = "这是1个用来测试的中文字符串";

  3. echo mb_substr($test, 0, 6, "EUC-JP");

  4. echo "<br>;<br>;";

  5. echo substr($test, 0, 6);
  6. ?>;
复制代码


没有EUC-CN,只好EUC-JP了

论坛徽章:
0
10 [报告]
发表于 2003-07-01 22:35 |只看该作者

半个汉字变问号,求解决办法.

原来还有这好东东。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP