为什么我写入mysql的汉字一个字不是两个字节而是更多?怎么截取? m_substr 是啥啊,没找到嘛 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 上面有啊function m_substr($str,$start) {preg_match_all("/[\x80-\xff]?./",$str,$ar);if(func_num_args() >= 3) {$end = func_get_arg(2);return join("",array_slice($ar[0],$start,$end));}elsereturn join("",array_slice($ar[0],$start));} 楼上说的对,utf-8的汉字占3个字节. function cut_str($sourcestr,$cutlength){$returnstr='';$i=0;$n=0;$str_length=strlen($sourcestr);//字符串的字节数while (($n<$cutlength) and ($i<=$str_length)){$temp_str=substr($sourcestr,$i,1);$ascnum=Ord($temp_str);//得到字符串中第$i位字符的ascii码if ($ascnum>=224) //如果ASCII位高与224,{$returnstr=$returnstr.substr($sourcestr,$i,3); //根据UTF-8编码规范,将3个连续的字符计为单个字符$i=$i+3; //实际Byte计为3$n++; //字串长度计1}elseif ($ascnum>=192) //如果ASCII位高与192,{$returnstr=$returnstr.substr($sourcestr,$i,2); //根据UTF-8编码规范,将2个连续的字符计为单个字符$i=$i+2; //实际Byte计为2$n++; //字串长度计1}elseif ($ascnum>=65 && $ascnum<=90) //如果是大写字母,{$returnstr=$returnstr.substr($sourcestr,$i,1);$i=$i+1; //实际的Byte数仍计1个$n++; //但考虑整体美观,大写字母计成一个高位字符}else //其他情况下,包括小写字母和半角标点符号,{$returnstr=$returnstr.substr($sourcestr,$i,1);$i=$i+1; //实际的Byte数计1个$n=$n+0.5; //小写字母和半角标点等与半个高位字符宽...}}if ($str_length>$cutlength){$returnstr = $returnstr . "...";//超过长度时在尾处加上省略号}return $returnstr;}网上找到的.我用过不错 utf8的字符编码和gbk不同,上面的函数不可用在mysql里,既然设置了字符集,直接left()就可以按字符(不是字节)截取了 用46个汉字和46个字母试了jianye112(http://hi.baidu.com/lael80)的,截取38个字,汉字可以,字母就全部显示46个,utf8的字符编码直接截取也不行啊,left()怎么用?asp里有php里没找到啊。46个汉字和46个字母用strlen得出汉字138,字母是46的长度,直接用substr截取38个汉字是得到12个加一个?号。字母就正确截取, 还有什么办法?没有就还用m_substr好了,截取25个字转一下,3/2*25=实际截取的字数,这样算了 left是在mysql里用的,到了php里,字符串是无编码的,一般那些函数很难判断字符串的编码。你也可以用mbstring里的函数。在mysql里如果你的title是utf8的,select left(title,8) ... 就会截取title的前8个字符,汉字和字母都各算一个字符,mysql的字符函数里很多都是认编码的,除了strlen等似乎还是算字节数。 是啊,怎麼沒想到在sql語句裡截取,晚上試試 php中preg_match_all函数的应用问题 php在设置cookies时怎么才能设置多个值 PHP如何调用数据库内容 谁能帮我解决一下,我的winmail只能收不能发 [分享]PHP利用共享内存构建计数器完成自增数值id生成--适用于网页游戏携带区服号的数值id生成 PHP关于POST请求的问题 这语法什么意思 倡议:BBS程序取消点击量记录 大型网站(做了数据库的负载均衡)出现取不到结果的情况? 数字四舍五入的问题 发邮件的问题,我很纳闷 关于smarty的templates设置问题
function m_substr($str,$start) {
preg_match_all("/[\x80-\xff]?./",$str,$ar);
if(func_num_args() >= 3) {
$end = func_get_arg(2);
return join("",array_slice($ar[0],$start,$end));
}else
return join("",array_slice($ar[0],$start));
}
{
$returnstr='';
$i=0;
$n=0;
$str_length=strlen($sourcestr);//字符串的字节数
while (($n<$cutlength) and ($i<=$str_length))
{
$temp_str=substr($sourcestr,$i,1);
$ascnum=Ord($temp_str);//得到字符串中第$i位字符的ascii码
if ($ascnum>=224) //如果ASCII位高与224,
{
$returnstr=$returnstr.substr($sourcestr,$i,3); //根据UTF-8编码规范,将3个连续的字符计为单个字符
$i=$i+3; //实际Byte计为3
$n++; //字串长度计1
}
elseif ($ascnum>=192) //如果ASCII位高与192,
{
$returnstr=$returnstr.substr($sourcestr,$i,2); //根据UTF-8编码规范,将2个连续的字符计为单个字符
$i=$i+2; //实际Byte计为2
$n++; //字串长度计1
}
elseif ($ascnum>=65 && $ascnum<=90) //如果是大写字母,
{
$returnstr=$returnstr.substr($sourcestr,$i,1);
$i=$i+1; //实际的Byte数仍计1个
$n++; //但考虑整体美观,大写字母计成一个高位字符
}
else //其他情况下,包括小写字母和半角标点符号,
{
$returnstr=$returnstr.substr($sourcestr,$i,1);
$i=$i+1; //实际的Byte数计1个
$n=$n+0.5; //小写字母和半角标点等与半个高位字符宽...
}
}
if ($str_length>$cutlength){
$returnstr = $returnstr . "...";//超过长度时在尾处加上省略号
}
return $returnstr;}
网上找到的.我用过不错
46个汉字和46个字母用strlen得出汉字138,字母是46的长度,
直接用substr截取38个汉字是得到12个加一个?号。字母就正确截取,
你也可以用mbstring里的函数。在mysql里
如果你的title是utf8的,
select left(title,8) ... 就会截取title的前8个字符,
汉字和字母都各算一个字符,mysql的字符函数里很多都是认编码的,
除了strlen等似乎还是算字节数。