无限星辰工作室-客户无限互联网动力之源

标题: Discuz!3.2 标题字数80字限制判断错误解决方案之一 [打印本页]

作者: crx349    时间: 2014-10-31 23:59
标题: Discuz!3.2 标题字数80字限制判断错误解决方案之一

找到并打开/source/function/function_core.php,寻找到827行:
  1. function dstrlen($str) {
  2.         if(strtolower(CHARSET) != 'utf-8') {
  3.                 return strlen($str);
  4.         }
  5.         $count = 0;
  6.         for($i = 0; $i < strlen($str); $i++){
  7.                 $value = ord($str[$i]);
  8.                 if($value > 127) {
  9.                         $count++;
  10.                         if($value >= 192 && $value <= 223) $i++;
  11.                         elseif($value >= 224 && $value <= 239) $i = $i + 2;
  12.                         elseif($value >= 240 && $value <= 247) $i = $i + 3;
  13.                 }
  14.                 $count++;
  15.         }
  16.         return $count;
  17. }
复制代码

写这个函数的,你在我注明红色的地方加了$count++;是几个意思啊,表示非常汗,其实这个函数写的很好了,都已经解决问题了,就因为你老人家加了这个,全部功能失效。大家把这个去掉,就修改好了PHP部分了。
修改成以下:
  1. function dstrlen($str) {
  2.         if(strtolower(CHARSET) != 'utf-8') {
  3.                 return strlen($str);
  4.         }
  5.         $count = 0;
  6.         for($i = 0; $i < strlen($str); $i++){
  7.                 $value = ord($str[$i]);
  8.                 if($value > 127) {
  9.                         if($value >= 192 && $value <= 223) $i++;
  10.                         elseif($value >= 224 && $value <= 239) $i = $i + 2;
  11.                         elseif($value >= 240 && $value <= 247) $i = $i + 3;
  12.                 }
  13.                 $count++;
  14.         }
  15.         return $count;
  16. }
复制代码




接下来是Javascript部分修改,让浏览器判断正确的标题字数。
找到并打开/static/js/common.js,找到112行:
  1. function mb_strlen(str) {
  2.         var len = 0;
  3.         for(var i = 0; i < str.length; i++) {
  4.                 len += str.charCodeAt(i) < 0 || str.charCodeAt(i) > 255 ? (charset == 'utf-8' ? 3 : 2) : 1;
  5.         }
  6.         return len;
  7. }
复制代码

修改成:
  1. function mb_strlen(str) {
  2.         var len = 0;
  3.         var strValue = '';
  4.         for(var i = 0; i < str.length; i++) {
  5.                 strValue = str.charCodeAt(i);
  6.                 if(strValue > 127) {
  7.                         if(strValue >= 192 && strValue <= 223) i++;
  8.                         else if(strValue >= 224 && strValue <= 239) i = i + 2;
  9.                         else if(strValue >= 240 && strValue <= 247) i = i + 3;
  10.                 }
  11.                 len++;
  12.         }
  13.         return len;
  14. }
复制代码




继续找到127行:
  1. function mb_cutstr(str, maxlen, dot) {
  2.         var len = 0;
  3.         var ret = '';
  4.         var dot = !dot ? '...' : dot;
  5.         maxlen = maxlen - dot.length;
  6.         for(var i = 0; i < str.length; i++) {
  7.                 len += str.charCodeAt(i) < 0 || str.charCodeAt(i) > 255 ? (charset == 'utf-8' ? 3 : 2) : 1;
  8.                 if(len > maxlen) {
  9.                         ret += dot;
  10.                         break;
  11.                 }
  12.                 ret += str.substr(i, 1);
  13.         }
  14.         return ret;
  15. }
复制代码

修改成:
  1. function mb_cutstr(str, maxlen, dot) {
  2.         var len = 0;
  3.         var ret = '';
  4.         var dot = !dot ? '...' : dot;
  5.         var strValue = '';
  6.         maxlen = maxlen - dot.length;
  7.         for(var i = 0; i < str.length; i++) {
  8.                 strValue = str.charCodeAt(i);
  9.                 if(strValue > 127) {
  10.                         if(strValue >= 192 && strValue <= 223) i++;
  11.                         else if(strValue >= 224 && strValue <= 239) i = i + 2;
  12.                         else if(strValue >= 240 && strValue <= 247) i = i + 3;
  13.             }
  14.             len++;
  15.                 if(len > maxlen) {
  16.                         ret += dot;
  17.                         break;
  18.                 }
  19.                 ret += str.substr(i, 1);
  20.         }
  21.         return ret;
  22. }
复制代码




继续找到1756行:
  1. function strLenCalc(obj, checklen, maxlen) {
  2.         var v = obj.value, charlen = 0, maxlen = !maxlen ? 200 : maxlen, curlen = maxlen, len = strlen(v);
  3.         for(var i = 0; i < v.length; i++) {
  4.                 if(v.charCodeAt(i) < 0 || v.charCodeAt(i) > 255) {
  5.                         curlen -= charset == 'utf-8' ? 2 : 1;
  6.                 }
  7.         }
  8.         if(curlen >= len) {
  9.                 $(checklen).innerHTML = curlen - len;
  10.         } else {
  11.                 obj.value = mb_cutstr(v, maxlen, 0);
  12.         }
  13. }
复制代码

修改成:
  1. function strLenCalc(obj, checklen, maxlen) {
  2.         var v = obj.value, charlen = 0, maxlen = !maxlen ? 200 : maxlen, curlen = 0, strValue = '';
  3.         for(var i = 0; i < v.length; i++) {
  4.                 strValue = v.charCodeAt(i);
  5.                 if(strValue > 127) {
  6.                         if(strValue >= 192 && strValue <= 223) i++;
  7.                         else if(strValue >= 224 && strValue <= 239) i = i + 2;
  8.                         else if(strValue >= 240 && strValue <= 247) i = i + 3;
  9.                 }
  10.                 curlen++;
  11.         }
  12.         if(maxlen >= curlen) {
  13.                 $(checklen).innerHTML = maxlen - curlen;
  14.         } else {
  15.                 obj.value = mb_cutstr(v, maxlen, 0);
  16.         }
  17. }
复制代码




如果开启了门户的话,找到并打开/static/js/portal.js,找到329行按照上面修改最后一部分的function strLenCalc修改就好了




欢迎光临 无限星辰工作室-客户无限互联网动力之源 (https://www.xmspace.net/) Powered by Discuz! X3.4