【永恒的瞬間】
          ?Give me hapy ?

          JavaScript 全角半角轉換問題

          問題 于 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 閱讀(4657) 評論(1)  編輯  收藏 所屬分類: java_code

          FeedBack:
          # re: JavaScript 全角半角轉換問題
          2008-02-15 21:09 | 365
          半角全角轉換(Javascript)

          ///全角空格為12288,半角空格為32
          ///其他字符半角(33-126)與全角(65281-65374)的對應關系是:均相差65248

          1//半角轉換為全角函數
          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 }

          1//全角轉換為半角函數
          function ToCDB(str)
          2 {
          3 var tmp = "";
          4 for(var i=0;i<str.length;i++)
          5 {
          6 if(str.charCodeAt(i)>65248&&str.charCodeAt(i)<65375)
          7 {
          8 tmp += String.fromCharCode(str.charCodeAt(i)-65248);
          9 }
          10 else
          11 {
          12 tmp += String.fromCharCode(str.charCodeAt(i));
          13 }
          14 }
          15 return tmp
          16 }   回復  更多評論
            
          主站蜘蛛池模板: 南充市| 桐乡市| 清河县| 舞钢市| 葫芦岛市| 新民市| 延津县| 鄱阳县| 临潭县| 东海县| 龙岩市| 横峰县| 双峰县| 奈曼旗| 永和县| 长白| 军事| 临漳县| 曲阳县| 祥云县| 宁远县| 大连市| 梁河县| 朝阳市| 尼勒克县| 龙游县| 桐梓县| 安远县| 客服| 郁南县| 涿鹿县| 旺苍县| 花莲县| 漠河县| 祁阳县| 红安县| 米易县| 建水县| 白河县| 毕节市| 应城市|