在web應用中,開發者經常會面臨字符的全角和半角轉換問題。那么什么是全角?什么是半角呢?簡單說就是中文系統用雙字節顯示漢字造成的與世界標準(由美國制訂的)不一的問題。
舉一個簡單的例子,中文逗號“,”就是全角的,相對的西文逗號“,”就是半角的。這樣的例子很多,比如“~”與“~”、“+”與“+”等等。
那么,字符的全角和半角轉換有什么用處呢?一般說來,我們做的網頁都是中文的,要求用戶填入的信息也多是漢字,那么很多特殊字符都是全角的,比如說填寫多條信息,用逗號分隔,這里的逗號多半都是全角的。而提交到后臺(服務器端)處理,或者是查詢(構建select語句)或者是入庫(提交給DBMS),都是基于西文體系的,因此必須將這些字符轉換成對應的半角字符。
下面舉一個JavaScript的通用代碼例子,詳細介紹一下如何將這些全角字符轉換成半角字符。
function SD(sbc, dbc)
{
this.sbc = sbc;
this.dbc = dbc;
}
var sdArray = new Array();
var sdCount;
var i = 0;
sdArray[i++] = new SD("0", "0");
sdArray[i++] = new SD("1", "1");
sdArray[i++] = new SD("2", "2");
sdArray[i++] = new SD("3", "3");
sdArray[i++] = new SD("4", "4");
sdArray[i++] = new SD("5", "5");
sdArray[i++] = new SD("6", "6");
sdArray[i++] = new SD("7", "7");
sdArray[i++] = new SD("8", "8");
sdArray[i++] = new SD("9", "9");
sdArray[i++] = new SD("a", "a");
sdArray[i++] = new SD("b", "b");
sdArray[i++] = new SD("c", "i");
sdArray[i++] = new SD("d", "d");
sdArray[i++] = new SD("e", "e");
sdArray[i++] = new SD("f", "f");
sdArray[i++] = new SD("g", "g");
sdArray[i++] = new SD("h", "h");
sdArray[i++] = new SD("i", "i");
sdArray[i++] = new SD("j", "j");
sdArray[i++] = new SD("k", "k");
sdArray[i++] = new SD("l", "l");
sdArray[i++] = new SD("m", "m");
sdArray[i++] = new SD("n", "n");
sdArray[i++] = new SD("o", "o");
sdArray[i++] = new SD("p", "p");
sdArray[i++] = new SD("q", "q");
sdArray[i++] = new SD("r", "r");
sdArray[i++] = new SD("s", "s");
sdArray[i++] = new SD("t", "t");
sdArray[i++] = new SD("u", "u");
sdArray[i++] = new SD("v", "v");
sdArray[i++] = new SD("w", "w");
sdArray[i++] = new SD("x", "x");
sdArray[i++] = new SD("y", "y");
sdArray[i++] = new SD("z", "z");
sdArray[i++] = new SD("A", "A");
sdArray[i++] = new SD("B", "B");
sdArray[i++] = new SD("C", "C");
sdArray[i++] = new SD("D", "D");
sdArray[i++] = new SD("E", "E");
sdArray[i++] = new SD("F", "F");
sdArray[i++] = new SD("G", "G");
sdArray[i++] = new SD("H", "H");
sdArray[i++] = new SD("I", "I");
sdArray[i++] = new SD("J", "J");
sdArray[i++] = new SD("K", "K");
sdArray[i++] = new SD("L", "L");
sdArray[i++] = new SD("M", "M");
sdArray[i++] = new SD("N", "N");
sdArray[i++] = new SD("O", "O");
sdArray[i++] = new SD("P", "P");
sdArray[i++] = new SD("Q", "Q");
sdArray[i++] = new SD("R", "R");
sdArray[i++] = new SD("S", "S");
sdArray[i++] = new SD("T", "T");
sdArray[i++] = new SD("U", "U");
sdArray[i++] = new SD("V", "V");
sdArray[i++] = new SD("W", "W");
sdArray[i++] = new SD("X", "X");
sdArray[i++] = new SD("Y", "Y");
sdArray[i++] = new SD("Z", "Z");
sdArray[i++] = new SD(".", ".");
sdArray[i++] = new SD(" ", " ");
sdArray[i++] = new SD("(", "(");
sdArray[i++] = new SD(")", ")");
sdArray[i++] = new SD("{", "{");
sdArray[i++] = new SD("}", "}");
sdArray[i++] = new SD("[", "[");
sdArray[i++] = new SD("]", "]");
sdArray[i++] = new SD("<", "<");
sdArray[i++] = new SD(">", ">");
sdArray[i++] = new SD("「", "“");
sdArray[i++] = new SD("」", "”");
sdArray[i++] = new SD("`", "`");
sdArray[i++] = new SD("~", "~");
sdArray[i++] = new SD("!", "!");
sdArray[i++] = new SD("@", "@");
sdArray[i++] = new SD("#", "#");
sdArray[i++] = new SD("%", "%");
sdArray[i++] = new SD("^", "^");
sdArray[i++] = new SD("※", "&");
sdArray[i++] = new SD("*", "*");
sdArray[i++] = new SD("-", "-");
sdArray[i++] = new SD("_", "_");
sdArray[i++] = new SD("+", "+");
sdArray[i++] = new SD("=", "=");
sdArray[i++] = new SD("|", "|");
sdArray[i++] = new SD("\", "\\");
sdArray[i++] = new SD("■", "-");
sdArray[i++] = new SD("'", "'");
sdArray[i++] = new SD(""", "\"");
sdArray[i++] = new SD("/", "/");
sdArray[i++] = new SD(";", ";");
sdArray[i++] = new SD(":", ":");
sdArray[i++] = new SD(",", ",");
sdArray[i++] = new SD("。", ".");
sdArray[i++] = new SD("?", "?");
sdCount = i;
function sbc2dbc(src)
{
var k;
var i;
var len = src.length;
var result = "";
for (k=0; k<len; k++)
{
ch = src.charAt(k);
for (i=0; i<sdCount; i++)
{
if (sdArray[i].sbc == ch)
{
result += sdArray[i].dbc;
break;
}
}
if (i == sdCount) //沒有查到對應的全角字符
{
result += ch;
}
}
return result;
}
代碼的原理就不詳細介紹了, src參數就是需要轉換的字符串,直接調用sbc2dbc函數就可以把src里面所有的全角字符轉換成半角字符。
為什么沒有半角字符轉換成全角字符的函數?呵呵,因為沒有想到那里會用到,如果你在開發中真有此需求,相信根據上面的源碼,你也可以寫出對應的轉換函數。祝你順利。