今天coding時,發現系統有一個地方是需要做全形自動轉半形的,就從網上搜到了下面的東西
檢查全形半形
var s = "bABD1232232";
var strCode;
for(var i=0;i<s.length;i++)
{
strCode = s.charCodeAt(i);
if((strCode>65248)||(strCode==12288)) //12288是空格
{
alert("有全形!");
break;
}
}
半形字元由一個位元組儲存,全形字元用兩個位元組儲存,所以碼值的絕對值小於256的就是半形,否則就是全形。
全形轉半形的函數
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;
}
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