<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>
半角字符由一個字節(jié)保存,全角字符用兩個字節(jié)保存
所以碼值的絕對值小于256的就是半角,否則就是全角
問題一:全角除了空格charCode是12288落在0~65248之間,還有哪些在字符也落在這個區(qū)間之內(nèi)?
問題二:如果用正則
<script language="JAVAscript">
function go(obj){
obj.value=obj.value.replace(/([^/x00-/xff])/g,function($1){return String.fromCharCode($1.charCodeAt(0)-65248)});
}
由于正則不管是八進(jìn)制(最多3位),16進(jìn)制(2位)如果輸入的是全半角混編的怎么辦?
響應(yīng)者 1:
第一個問題,你的范圍有問題,
<script language=JAVAscript>
function DBC2SBC(str)
{
var result = '';
for(var i=0;i<str.length;i++){
code = str.charCodeAt(i);//獲取當(dāng)前字符的unicode編碼
if (code >= 65281 && code <= 65373)//在這個unicode編碼范圍中的是所有的英文字母已經(jīng)各種字符
{
result += String.fromCharCode(str.charCodeAt(i) - 65248);//把全角字符的unicode編碼轉(zhuǎn)換為對應(yīng)半角字符的unicode碼
}else if (code == 12288)//空格
{
result += String.fromCharCode(str.charCodeAt(i) - 12288 + 32);
}else
{
result += str.charAt(i);
}
}
return result;
}
alert(DBC2SBC("FSDFSDG廣泛豆腐干"))
</script>
下面的這段是我自己猜測的
全角轉(zhuǎn)半角
JAVAscript 是16位編碼
65281到65373只有這里面的數(shù)據(jù)才是全角,這里要有范圍限制的
關(guān)于65281的算法是這么來的
比如全角的字符A
編碼為FF21
轉(zhuǎn)成16進(jìn)制是
1111 1111 0010 0001
對兩個字節(jié)分別取10進(jìn)制的值
第一個字節(jié)是
65280
第二個自己是
33
所以a的65313
對這個編碼減去
65248得半角的
65248比65280小32
所以我想ASC碼小于32的就不能轉(zhuǎn)換
因?yàn)檗D(zhuǎn)換了字符編碼的前一字節(jié)就不能是1111 1111即FF
就會比這個小,那應(yīng)該就不是全角了
就是說第一字節(jié)不能滿足全為1
而你的第二個問題,根本不用考慮混用的時候
因?yàn)?br>
replace的第一個參數(shù)正則會區(qū)分開的
響應(yīng)者 2:
就第一個問題shift+$在全角下輸出為¥其CharCode為65509已經(jīng)超出范圍
我知道這個范圍是code >= 65281 && code <= 65373對于¥這樣的符號又
怎么辦?
第二個問題,replace會區(qū)分全角半角?怎么區(qū)分?
響應(yīng)者 3:
function ToDBC(obj)//全角轉(zhuǎn)半角
{
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;
}
///全角空格為12288,半角空格為32
///其他字符半角(33-126)與全角(65281-65374)的對應(yīng)關(guān)系是:均相差65248
1//半角轉(zhuǎn)換為全角函數(shù)
2 function ToDBC(txtstring)
3 {
4 var tmp = "";
5
6 for(var i=0;i<txtstring.length;i++)
7 {
8 if(txtstring.charCodeAt(i)==32)
9 {
10 tmp= tmp+ String.fromCharCode(12288);
11 }
12 if(txtstring.charCodeAt(i)<127)
13 {
14 tmp=tmp+String.fromCharCode(txtstring.charCodeAt(i)+65248);
15 }
16
17 }
18 return tmp;
19 }
//全角轉(zhuǎn)換為半角函數(shù)
function ToCDB(str)
{
var tmp = "";
for(var i=0;i<str.length;i++)
{
if(str.charCodeAt(i)>65248&&str.charCodeAt(i)<65375)
{
tmp += String.fromCharCode(str.charCodeAt(i)-65248);
}
else
{
tmp += String.fromCharCode(str.charCodeAt(i));
}
}
return tmp
}