中文輸入法為什麼會有全形和半形的區別?

全形輸入,比如123456ABCDE。我想了解下為什麼在中文輸入法中會有全形這個功能的?我好像沒發現它有什麼用。


這些全形符號似乎是雙位元組中文編碼的歷史遺留問題。當年在純文本的界面中,為了讓西文和中日韓的方塊字對齊,就讓西文字母、數字和標點也佔用一個漢字的視覺空間,並且使用 2 個位元組存儲。

後來,其中的一些全形字元因為比較有用,就得到了廣泛應用(比如全形的逗號「,」、問號「?」、感嘆號「!」、空格「 」等),專用於中日韓文本,成為了標準的中日韓標點字元。而其它的許多全形符號失去了價值(我們現在很少需要讓純文本的中文和西文字字對齊了),就很少再用了。

另外需要說明的是:

現在全球文本編碼的事實標準是 UTF-8 等基於 Unicode 的編碼。Unicode 吸納了許多遺留(legacy)編碼,並且為了兼容性而保留了所有字元。所以這些沒什麼用的全形字元也留下來了。而國家標準也仍在要求字體和軟體支持這些全形字元。

不過,半形和全形字元的關係在 UTF-8 等編碼中不再是簡單的 1 位元組和 2 位元組的關係了。


「全形」與「半形」兩個術語應該都是從日本來的。印刷上縱橫比為1:1的字元(塊)稱為全形,其四、三、二分之一分別稱作「四分」、「三分」、「二分」。

文字處理電子化之後,JIS C 6220 標準將所有片假名編入 ASCII 未用的單位元組高位(同時對低位的幾個字元做了修改,比如 backslash,這就是為什麼早期 Windows 上裝日文遊戲的時候路徑分隔符會變成日元符號)。所有這些符號在早期的點陣顯示器上有 8 像素的寬度就可以得到很好的效果了。

為了裝入漢字,編碼必須使用兩個位元組,而顯示起來,8 像素捉襟見肘,16 像素是最簡單也是最貼合雙位元組編碼的選擇。這樣一來,英文字元恰好在編碼和顯示時都是漢字的一半。

JIS X 4051《日本語文書の組版方法》裡面,將全形定義為「漢字一文字的外框」,半形定義為「字寬為全形二分之一的文字之外框」。

至於為什麼全形字元會有英文,我個人猜測是為了豎排,或者漢字必須行列對齊的其他情形。

詳情請參閱 http://ja.wikipedia.org/wiki/%E5%85%A8%E8%A7%92%E3%81%A8%E5%8D%8A%E8%A7%92


以前是比例字體不成熟的時候,在等寬字體的輸入場合,為了讓英文字母佔據和中文字母同樣大小的空間,顯得美觀。

現在呢,多數時候是沒什麼必要了,是不是有些生僻的場合還有必要,比如ASCII畫?我猜多數就是個習慣吧。


符號衝突是主要原因

有些數字或符號是有衝突的,比如英文逗號","與中文逗號",",用眼睛就可以看出長度與大小是不一樣的。當在鍵盤上輸入逗號時,中文輸入法不確定你想要的是哪種逗號(中/英),所以就提供了全形半形模式,英文半形輸出英文逗號,其它模式就是中文逗號,這樣,我們用一種輸入法就能打出兩種符號,而不用切換成其它輸入法。

更細緻的原因要從以下各點說起:

1. 二進位

計算機普遍遵循馮諾依曼結構體系,它規定了計算機內部以二進位為主要數制(這和電路有關),所以計算機只認識二進位的0或1。其它符號比如十進位的[2-9],字母[a-zA-Z],標點符號,中文等等是不認識的。那麼,當我們說"a"的時候,它是怎麼理解的呢?

2. 編碼表

即然計算機只認識01符號,那我們就可以建立一套"映射系統",比如

a &<--&> 00000001

b &<--&> 00000010

c &<--&> 00000011

當我們說"a"的時候,計算機就理解為"00000001",即一個符號,用一串唯一的二進位表示,這套"映射系統"就稱為編碼表。

3. ASCII編碼表

因為早期的計算機只在發達的歐美國家使用,所以這套"映射系統"是根據英文規則設計的,叫ASCII表,規定用8位長度的二進位表示一個字元,最多可以表示 2^8 = 256 個字元。ASCII表涵蓋了英文字母,數字,和常用的英文符號,比如",.+-"等,

可普通漢字就有6萬多個,很明顯8位的ASCII編碼方案滿足不了中文系統的要求,比如中文 "啊"就無法用ASCII表示。

4. 中文編碼表

由上我們知道,只要再設計一套長度更大的"映射系統"就可以解決問題了,比如

啊 = 00000000 00000001

哦 = 00000000 00000010

即使用16位二進位(兩位元組)表示一個漢字,最多可表示 2^16 = 65536 個。

早期中文系統設計的時候,是用GB2312標準,但這套標準有部分的漢字,符號,少數民族用語是沒有映射過去的,比如在GB2312中就打不出「鎔"字,所以往後就出了編碼範圍更大的編碼表,如GBK,GB18030。這些編碼表只有一個區別,就是能表示的漢字或符號範圍越來越大了,但相應的,需要映射的二進位位數也越來越大了,即漢字可能需要用2-4位位元組(16-32位二進位)表示,存儲成本增加了。

5. 全形與半形

綜上,我們知道

5.1 計算機只認識二進位01,所有的字形符號都是通過編碼表(映射系統)翻譯實現的

5.2 在英文系統的編碼表里,有用一位元組表示的標點符號,如英文逗號","

5.3 在中文系統的編碼表里,有用N(1-4)位元組表示的標點符號,如中文逗號",」

語義上我們統稱為逗號,但計算機實際表現形式是不同的

英文逗號"," 在ASCII規則下是 00101100,一位元組長,屏幕列印寬度是一個寬度

中文逗號"," 在GBK規則下是 10100011 10101100,兩位元組長,屏幕列印寬度是兩個寬度

半形就是指 ASCII 編碼表以內的標點符號,它們都是佔一個位元組,一個列印寬度的

全形就是指在ASCII編碼表以外,如GBK,BIG5, Unicode等編碼規則下的,多位元組的標點符號,屏幕列印寬度通常是兩個寬度,即一個漢字寬度。

簡言之,ASCII以內的就叫半形符號,以外的就叫全形符號。


這個問題由計算機編程人員來回複比較好。

全形和半形的區別很簡單:全形的標點符號佔2個位元組,半形的標點符號佔1個位元組。

從這個區別入手來分析用途,就會容易get到存在的理由。

作為一個中文系,不深究計算機系統的人從這幾個角度考慮:

1、全形符號是源於漢字,半形符號是源於英文系統、web運用;

2、既然是web運用,那麼電腦伺服器端默認的是英文系統,對於半形輸入法的運用就比全形的多;

3、以前的編程人員習慣於切換全形半形輸入法,這個使用上的過渡可能會延續一段時間。

以上僅為外圍看熱鬧的考量,求輕噴。


《徹底搞懂編碼 GBK 和 UTF8》


  半形和全形切換方法:單擊輸入法工具條上的按鈕或按鍵盤上的Shift+Space鍵來切換。

  1、全形:指一個字元佔用兩個標準字元位置。

  漢字字元和規定了全形的英文字元及國標GB2312-80中的圖形符號和特殊字元都是全形字元。一般的系統命令是不用全形字元的,只是在作文字處理時才會使用全形字元。

  2、半形:指一字元佔用一個標準的字元位置。

  通常的英文字母、數字鍵、符號鍵都是半形的,半形的顯示內碼都是一個位元組。在系統內部,以上三種字元是作為基本代碼處理的,所以用戶輸入命令和參數時一般都使用半形。

  3、全形與半形各在什麼情況下使用?

  全形佔兩個位元組,半形佔一個位元組。

  半形全形主要是針對標點符號來說的,全形標點佔兩個位元組,半形佔一個位元組,而不管是半形還是全形,漢字都還是要佔兩個位元組。

  在編程序的源代碼中只能使用半形標點(不包括字元串內部的數據)

  在不支持漢字等語言的計算機上只能使用半形標點(其實這種情況根本就不存在半形全形的概念)

  對於大多數字體來說,全形看起來比半形大,當然這不是本質區別了。

  4、全形和半形的區別

  全形就是字母和數字等與漢字占等寬位置的字。半形就是ASCII方式的字元,在沒有漢字輸入法起做用的時候輸入的字母數字和字元都是半形的。

  在漢字輸入法出現的時候,輸入的字母數字默認為半形,但是標點則是默認為全形,可以通過滑鼠點擊輸入法工具條上的相應按鈕來改變。

  5、關於「全形」和「半形」:

  全形:是指中GB2312-80(《信息交換用漢字編碼字符集·基本集》)中的各種符號。

  半形:是指英文件ASCII碼中的各種符號。

  全形狀態下字母、數字元號等都會佔兩個位元組的位置,也就是一個漢字那麼寬,半形狀態下,字母數字元號一般會佔一個位元組,也就是半個漢字的位置,全形半形對漢字沒有影響。


貌似是2種編碼規範吧,半形是ASCII的編碼,全形是GB2312的編碼


推薦閱讀:

TAG:輸入法 | 字元編碼 | 中日韓統一表意文字CJK | ASCII | GB2312/GBK/GB18030 |