且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

自己写的js substr支持中文截取(中文是双字符)

更新时间:2022-02-13 06:29:26

Sb_substr代码  自己写的js substr支持中文截取(中文是双字符)
  1. //得到字符总数  
  2. function getChars(str) {  
  3.     var i = 0;  
  4.     var c = 0.0;  
  5.     var unicode = 0;  
  6.     var len = 0;  
  7.   
  8.     if (str == null || str == "") {  
  9.         return 0;  
  10.     }  
  11.     len = str.length;  
  12.     for(i = 0; i < len; i++) {  
  13.             unicode = str.charCodeAt(i);  
  14.         if (unicode < 127) { //判断是单字符还是双字符  
  15.             c += 1;  
  16.         } else {  //chinese  
  17.             c += 2;  
  18.         }  
  19.     }  
  20.     return c;  
  21. }  
  22.   
  23. function sb_strlen(str) {  
  24.     return getChars(str);  
  25. }  
  26. //截取字符  
  27. function sb_substr(str, startp, endp) {  
  28.     var i=0; c = 0; unicode=0; rstr = '';  
  29.     var len = str.length;  
  30.     var sblen = sb_strlen(str);  
  31.   
  32.     if (startp < 0) {  
  33.         startp = sblen + startp;  
  34.     }  
  35.   
  36.     if (endp < 1) {  
  37.         endp = sblen + endp;// - ((str.charCodeAt(len-1) < 127) ? 1 : 2);  
  38.     }  
  39.     // 寻找起点  
  40.     for(i = 0; i < len; i++) {  
  41.         if (c >= startp) {  
  42.             break;  
  43.         }  
  44.         var unicode = str.charCodeAt(i);  
  45.         if (unicode < 127) {  
  46.             c += 1;  
  47.         } else {  
  48.             c += 2;  
  49.         }  
  50.     }  
  51.   
  52.     // 开始取  
  53.     for(i = i; i < len; i++) {  
  54.         var unicode = str.charCodeAt(i);  
  55.         if (unicode < 127) {  
  56.             c += 1;  
  57.         } else {  
  58.             c += 2;  
  59.         }  
  60.         rstr += str.charAt(i);  
  61.   
  62.         if (c >= endp) {  
  63.             break;  
  64.         }  
  65.     }  
  66.   
  67.     return rstr;  
  68. }  
  69. //调用示例:  
  70. function getShortFileName(filename) {  
  71.     short_filename = filename;  
  72.     if (sb_strlen(short_filename) > 61) {  
  73.         short_filename = sb_substr(short_filename, 036) + ' ... ' + sb_substr(short_filename, -20);  
  74.     }  
  75.     return short_filename;  
  76. }  
  77.   
  78. var chara = 'ni你2好1啊!'  
  79. js_self = chara.substr(4);  
  80. test = sb_substr(chara,4);  
  81. alert("js_self:"+js_self+"ext:"+test);  
  82.   
  83. function mb_strlen(str) {  
  84.     var len = 0;  
  85.     for(var i = 0; i < str.length; i++) {  
  86.         len += str.charCodeAt(i) < 0 || str.charCodeAt(i) > 255 ? (charset == 'utf-8' ? 3 : 2) : 1;  
  87.     }  
  88.     return len;  
  89. }  
  90.   
  91.  <script language="JavaScript">  

<!--
function CutStrLength(str,Ilength)
{
var tmp=0;
var len=0;
var okLen=0
for(var i=0;i<Ilength;i++)
{
if(str.charCodeAt(i)>255)
tmp+=2
else
len+=1
okLen+=1
if(tmp+len==Ilength)
{
return (str.substring(0,okLen));
break;
}
if(tmp+len>Ilength)
{
return (str.substring(0,okLen-1)+"");
break;
}
}
}
function checkFieldLength(fieldName,fieldDesc,fieldLength)
{
var str=document.getElementById(fieldName).value;
var theLen=0;
var teststr='';
for(i=0;i<str.length;i++)
{
teststr=str.charAt(i);
if(str.charCodeAt(i)>255)
theLen=theLen+2;
else
theLen=theLen+1;
}
document.getElementById('showMsg').innerText=theLen;
if(theLen>fieldLength)
{
document.getElementById('showMsg').innerText=fieldDesc;
//alert(fieldDesc+" 的字段长度超过规定长度!");
//document.getElementById(fieldName).focus();
document.getElementById(fieldName).value=CutStrLength(str,fieldLength);
return false;
}
else
{
return true;
}
}
//-->
</script>

</head>
<body>
<form method="POST" action="">
<textarea id="testArea" name="testArea" rows="3" cols="22" onkeyup="checkFieldLength('testArea', '超过允许输入的字符个数', 20);"
onchange="checkFieldLength('testArea', '超过允许输入的字符个数', 20);"></textarea>
<div id="testInfo">
已经输入:<span id="showMsg"></span></div>
</form>
</body>
</html>