如何截取规定长度的字符串??

时间:2021-09-29 04:35:48
可能这是一个老问题,即

假如用户输入的字符串为20个汉字或30个英文字母,我想截取前10位汉字(即20个英文字母),通常我们是用.length().substring(0,10)方法来实现,这个方法的好处是不管是中文还是英文,都取10个,现在客户有要求,如果是英文,则取20个,即不管是中文、英文还是中英文混合,都要求取前20个字节,请问各位,如何写成通用函数才能截取?最麻烦的是中英文混合。(最好有源码)

谢谢!!

7 个解决方案

#1


1234567890

#2



  <p><textarea rows="11" name="S1" cols="51"></textarea></p>
<p><input type="button" value="按钮" onclick=ttt()></p>
<script>
function ttt(){
txt=brkLine(S1.value,20)

pr.innerHTML=txt;
}
function brkLine(txt,charlen){

s=""
l=0;
p=0;
for (i=0;i<txt.length;i++){
a=txt.charAt(i);
s+=a;
if (p!=0){
if (a==">") p=0; 
}
else
{   if (a!="<"){  
   
if (!/^[\x00-\xff]/.test(a)) l++;
l++;

if (l>=charlen){
  s+="<br>";
  l=0;
}
}
else 
if (txt.substr(i,4).toLowerCase()=="<br>"){
s+="br>";
i+=4;
l=0;
}else  p=1;

}
}
return s;
}
</script>
<table border="1" width="30%" height="107">
  <tr>
    <td width="100%" height="101" valign="top" id=pr>每行20个字符</td>
  </tr>
</table>
 

#3


得到固定字符位置的函数

   
<Script language="Javascript" Runat="Server">
/*
=======================================================================================
本程序段的功能:

给定一个字符串,不管是英文还是中文,还是中英文混合的,只取前面的8个英文字母占位的宽度。
关于该程序的说明:当最后一个字为中文,并且前面已经取得7位时,就不应该再取这个字了。再
最后位置补空格; 否则的话,总共就会占9个英文字符的位置了。
本程序由net_lover(孟子E章)编写,您可以任意使用本程序,但要保持本注释。
有任何疑问请Email至: amxh@21cn.com
欢迎访问:
http://lucky.myrice.com
http://colorweb.go.163.com
=======================================================================================
*/
function get8Length(str)

var tmp = 0;
var len = 0;
var okLen = 0
for(var i=0;i<8;i++)
{
if(str.charCodeAt(i)>255)
tmp += 2 
else
len += 1
okLen += 1
if(tmp + len == 8) 
{
return (str.substring(0,okLen));
break;
}
if(tmp + len > 8)
{
return (str.substring(0,okLen - 1) + "&nbsp;"); 
break;
}
}

</Script>
<%
Dim strTest
strTest = "我是孟子E章啊!!"
Response.write get8Length(strTest) & "……<br>"
strTest = "我是net_lover!!"
Response.write get8Length(strTest) & "……<br>"
strTest = "I我a是m孟子E章啊!!"
Response.write get8Length(strTest) & "……<br>"
%>
 

#4


<script>
s="谦ss逊在要sfkjsjf"
alert(cutstr(s,7));
function cutstr(string,len){
var i,k;
k=0;
i=0;
while ( i<len && i< string.replace(/[^\x00-\xff]/g,"xx").length){
   if(string.charCodeAt(k)>255) i++;
   i++;
   k++;
}
return string.substr(0,k);

</script>

#5


to: 8988(晓月)

当最后一个字为中文,并且前面已经取得7位时,就不应该再取这个字了,
你应该在那里处理呢?

#6


结帖了,决定采用net_lover(孟子E章)的方法 ,不过对另外两位的帮助也表示感谢。为了感谢大家,在分不是很多的情况下,每人都给予奖励,希望今后得到一如既往的支持。

#7


<script>
alert(getLen("秋12水无3恨4",5))
function getLen(str,len){
var k=1;
for(i=0;i<str.length;i++,k++){if(str.charCodeAt(i)>255)k++;if(k>len)break};
return str.substr(0,i);
}
</script>

#1


1234567890

#2



  <p><textarea rows="11" name="S1" cols="51"></textarea></p>
<p><input type="button" value="按钮" onclick=ttt()></p>
<script>
function ttt(){
txt=brkLine(S1.value,20)

pr.innerHTML=txt;
}
function brkLine(txt,charlen){

s=""
l=0;
p=0;
for (i=0;i<txt.length;i++){
a=txt.charAt(i);
s+=a;
if (p!=0){
if (a==">") p=0; 
}
else
{   if (a!="<"){  
   
if (!/^[\x00-\xff]/.test(a)) l++;
l++;

if (l>=charlen){
  s+="<br>";
  l=0;
}
}
else 
if (txt.substr(i,4).toLowerCase()=="<br>"){
s+="br>";
i+=4;
l=0;
}else  p=1;

}
}
return s;
}
</script>
<table border="1" width="30%" height="107">
  <tr>
    <td width="100%" height="101" valign="top" id=pr>每行20个字符</td>
  </tr>
</table>
 

#3


得到固定字符位置的函数

   
<Script language="Javascript" Runat="Server">
/*
=======================================================================================
本程序段的功能:

给定一个字符串,不管是英文还是中文,还是中英文混合的,只取前面的8个英文字母占位的宽度。
关于该程序的说明:当最后一个字为中文,并且前面已经取得7位时,就不应该再取这个字了。再
最后位置补空格; 否则的话,总共就会占9个英文字符的位置了。
本程序由net_lover(孟子E章)编写,您可以任意使用本程序,但要保持本注释。
有任何疑问请Email至: amxh@21cn.com
欢迎访问:
http://lucky.myrice.com
http://colorweb.go.163.com
=======================================================================================
*/
function get8Length(str)

var tmp = 0;
var len = 0;
var okLen = 0
for(var i=0;i<8;i++)
{
if(str.charCodeAt(i)>255)
tmp += 2 
else
len += 1
okLen += 1
if(tmp + len == 8) 
{
return (str.substring(0,okLen));
break;
}
if(tmp + len > 8)
{
return (str.substring(0,okLen - 1) + "&nbsp;"); 
break;
}
}

</Script>
<%
Dim strTest
strTest = "我是孟子E章啊!!"
Response.write get8Length(strTest) & "……<br>"
strTest = "我是net_lover!!"
Response.write get8Length(strTest) & "……<br>"
strTest = "I我a是m孟子E章啊!!"
Response.write get8Length(strTest) & "……<br>"
%>
 

#4


<script>
s="谦ss逊在要sfkjsjf"
alert(cutstr(s,7));
function cutstr(string,len){
var i,k;
k=0;
i=0;
while ( i<len && i< string.replace(/[^\x00-\xff]/g,"xx").length){
   if(string.charCodeAt(k)>255) i++;
   i++;
   k++;
}
return string.substr(0,k);

</script>

#5


to: 8988(晓月)

当最后一个字为中文,并且前面已经取得7位时,就不应该再取这个字了,
你应该在那里处理呢?

#6


结帖了,决定采用net_lover(孟子E章)的方法 ,不过对另外两位的帮助也表示感谢。为了感谢大家,在分不是很多的情况下,每人都给予奖励,希望今后得到一如既往的支持。

#7


<script>
alert(getLen("秋12水无3恨4",5))
function getLen(str,len){
var k=1;
for(i=0;i<str.length;i++,k++){if(str.charCodeAt(i)>255)k++;if(k>len)break};
return str.substr(0,i);
}
</script>