使用Python轉換全角字符串為半角
關于全角轉換為半角的問題,其實源自在公司的運營人員在輸入法切換的時候選擇了全角,結果導致程序有時候沒有辦法進行解析。
為了避免這樣的問題再次出現(xiàn),于是就有了將全角轉換為半角的問題了。
在這里,會對以下內(nèi)容進行描述:
- 什么是全角
- 如何將全角字符轉換為半角
- 使用python實現(xiàn)上述轉換操作
我們知道在編碼中,存儲在計算機中僅僅是1個數(shù)字,而編碼其實充當?shù)氖?種轉換的過程,如果將1個字符轉換為1個數(shù)字而問題。
全角和半角
一般情況下,普通的英文字符只占用1個字節(jié)的空間,而1個字節(jié)有8位,因此可以存儲256個字符。而漢字、日語及朝鮮文字這樣CJK的文字很明顯不止256個,因此會使用2個字節(jié)來存儲。
而在使用英文輸入法時,我們將1個英文字符所占的位置稱為半角。而由于1個漢字占用2個英文字符的位置,因為我們將其稱為全角。
需要注意的是,只有在支持漢字等語言的計算及上才存在全角和半角的概念。另外,雖然通常情況下的英文字母、數(shù)字鍵及符號鍵都是半角的,但是為了排列整齊,英文和其他拉丁文的字符和標簽也可以使用全角格式。
因此,我們知道全角需要占用2個字節(jié),而半角則占用1個字節(jié)。
全角轉換為半角
在ASCII編碼中,我們知道可以打印的字符只有127-33=94個。在這里,我們需要去除del鍵及ASCII編碼表中前32位。
由于半角和全角只是占用字節(jié)個數(shù)的不同,因此全角可打印的字符也是94個。因此這2者之間是存在規(guī)律的,比如我們假設半角a字符的在計算機中存儲的數(shù)字為60,而全角的a字符在計算機中存儲的數(shù)字為1200。而假設a的下1個字符為b,其存儲的數(shù)字為61, 那么全角的b字符存儲的數(shù)字應為1201。
因此,這種一一映射的關系就查看各種規(guī)范中是如何定義的了。不同的規(guī)范定義會有所不同。
由于在Unicode規(guī)定中,半角字符是從33開始,到126結束。而Unicode中全角的編碼是從65281開始到65374結束。
細心的你們會發(fā)現(xiàn),這里少了1個字符,那就是空格。在半角中,空格是32,而在全角中它是12288。
python的實現(xiàn)轉換
現(xiàn)在,我們使用python來實現(xiàn)轉換的操作,我們會檢查給定的字符是否為全角,只有在全角的情況下才進行轉換的操作。
- def FullToHalf(s):
- n = []
- s = s.decode('utf-8')
- for char in s:
- num = ord(char)
- if num == 0x3000:
- num = 32
- elif 0xFF01 <= num <= 0xFF5E:
- num -= 0xfee0
- num = unichr(num)
- n.append(num)
- return ''.join(n)
在這里,我們對字符串進行遍歷,然后判斷其字符的大小,如果給定的字符是全角則將其進行減法操作。***將其組裝在一起返回就可以了。
然后我們進行如下的測試:
- s = "張三,是1個帥哥。"
- result = FullToHalf(s)
- print result
- print '-' * 80
- print s
其結果如下所示:
- 張三,是1個帥哥。
- -----------------------------------------------------------------------
- 張三,是1個帥哥。
當然,除了以上的方式外,還有其他的方式將全角轉換為半角。比如我隔壁那個搞python的哥們直接就用正則進行匹配然后批量的進行轉換。
由于我比較懶和能力比較有限,只好通過上面的方式來簡化我的工作量。