假如用户输入的字符串为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) + " ");
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>"
%>
<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) + " ");
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>
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位时,就不应该再取这个字了,
你应该在那里处理呢?
当最后一个字为中文,并且前面已经取得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>
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) + " ");
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>"
%>
<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) + " ");
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>
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位时,就不应该再取这个字了,
你应该在那里处理呢?
当最后一个字为中文,并且前面已经取得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>
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>