全型轉半型

分類: 技術分享 作者: suzy

13 8 月 2009

今天想要分享的是 中文字 全型轉半型的 function!

之前的做法很土法鍊鋼, 就是笨笨地用取代(str_replace)的方式把所有全型字一一換成半型字, 但是客戶經常回報, 某些特定字會造成亂碼, 像是 '中央北路' and '郭郭' 等.... 造成了許多困擾.

因此上網搜尋了一下, 且找到了一個真正的解決方法.......

出處: [原创]PHP全角转半角算法和函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
function fullToHalf($str, $encode='Big5') {
	if ($encode != 'UTF8') {
		$str = mb_convert_encoding($str, 'UTF-8', $encode);
	}
	$ret='';
	for ($i=0; $i < strlen($str); $i++) {
 
		$s1 = $str[$i];
 
		// 判斷 $c 第八位是否為 1 (漢字)
		if( ($c=ord($s1)) & 0x80 ) { 
			$s2 = $str[++$i];
			$s3 = $str[++$i];
			$c = (($c & 0xF) << 12) | ((ord($s2) & 0x3F) << 6) | (ord($s3) & 0x3F);
 
			if ($c == 12288) {
				$ret .= ' ';
			} elseif ($c > 65280 && $c < 65375) {
				$c -= 65248;
				$ret .= chr($c);
			} else {
				$ret .= $s1 . $s2 . $s3;
			}
 
		} else {
			$ret .= $str[$i];
		}
	}
 
	return ($encode== 'UTF-8' ? $ret : mb_convert_encoding($ret, $encode, 'UTF-8'));
 
}

研究了一下寫法, 複習了一下 Bitwise Operators (位元運算)

  • << - Shift left (means "multiply by two")
  • & - And
  • | - Or (inclusive or)

程式裡有0x的為16進位數:

  • 0x80 = 16 * 8 = 128 = 10000000
  • 0xF = 15 = 1111
  • 0x3F = 3 * 16 + 15 = 48 + 15 = 63 (也可以從 ASCII table 找)

全型與半型:

  • 半型字符範圍:33-126
  • 全型字符範圍:65281-65374
  • 對應關係是相差:65248
  • 全型空格:12288
  • 半型空格:32

心得

這個function還真好用阿 XD, 又可順便複習一下 Bitwise, 雖然我們很少用到, 但它其實還有很多活用空間唷.

我要留言

關於這裡

這個部落格分享了哇寶在電子商務領域的技術及資訊,希望能讓更多人一起為台灣的網路產業加油。