问题 于 2006-09-14 14:02
<script language=
JAVAscript>
var s="b";
var strCode
for(var i=0;i<s.length;i++)
{
strCode=s.charCodeAt(i);
if((strCode>65248)||(strCode==12288))
{
alert("有全角");
break;
}
}
</script>
半角字符由一个字节保存,全角字符用两个字节保存
所以码值的绝对值小于256的就是半角,否则就是全角
问题一:全角除了空格charCode是12288落在0~65248之间,还有哪些在字符也落在这个区间之内?
问题二:如果用正则
<script language="
JAVAscript">
function go(obj){
obj.value=obj.value.replace(/([^\x00-\xff])/g,function($1){return String.fromCharCode($1.charCodeAt(0)-65248)});
}
由于正则不管是八进制(最多3位),16进制(2位)如果输入的是全半角混编的怎么办?
响应者 1:
第一个问题,你的范围有问题,
<script language=
JAVAscript>
function DBC2SBC(str)
{
var result = '';
for(var i=0;i<str.length;i++){
code = str.charCodeAt(i);//获取当前字符的unicode编码
if (code >= 65281 && code <= 65373)//在这个unicode编码范围中的是所有的英文字母已经各种字符
{
result += String.fromCharCode(str.charCodeAt(i) - 65248);//把全角字符的unicode编码转换为对应半角字符的unicode码
}else if (code == 12288)//空格
{
result += String.fromCharCode(str.charCodeAt(i) - 12288 + 32);
}else
{
result += str.charAt(i);
}
}
return result;
}
alert(DBC2SBC("FSDFSDG广泛豆腐干"))
</script>
下面的这段是我自己猜测的
全角转半角
JAVAscript 是16位编码
65281到65373只有这里面的数据才是全角,这里要有范围限制的
关于65281的算法是这么来的
比如全角的字符A
编码为FF21
转成16进制是
1111 1111 0010 0001
对两个字节分别取10进制的值
第一个字节是
65280
第二个自己是
33
所以a的65313
对这个编码减去
65248得半角的
65248比65280小32
所以我想ASC码小于32的就不能转换
因为转换了字符编码的前一字节就不能是1111 1111即FF
就会比这个小,那应该就不是全角了
就是说第一字节不能满足全为1
而你的第二个问题,根本不用考虑混用的时候
因为
replace的第一个参数正则会区分开的
响应者 2:
就第一个问题shift+$在全角下输出为¥其CharCode为65509已经超出范围
我知道这个范围是code >= 65281 && code <= 65373对于¥这样的符号又
怎么办?
第二个问题,replace会区分全角半角?怎么区分?
响应者 3:
function ToDBC(obj)//全角转半角
{
var str=obj.value;
var result="";
for (var i = 0; i < str.length; i++)
{
if (str.charCodeAt(i)==12288)
{
result+= String.fromCharCode(str.charCodeAt(i)-12256);
continue;
}
if (str.charCodeAt(i)>65280 && str.charCodeAt(i)<65375)
result+= String.fromCharCode(str.charCodeAt(i)-65248);
else result+= String.fromCharCode(str.charCodeAt(i));
}
obj.value=result;
}
posted on 2007-02-02 20:25
☜♥☞MengChuChen 阅读(4633)
评论(1) 编辑 收藏 所属分类:
java_code