--- title: 半型!全型!資料到底要哪種! tags: ASP.NET,C#,SQL --- 半型!全型!資料到底要哪種! === ###### tags:`ASP.NET` `C#` `SQL` ### :book: 資料從哪來?長什麼樣子? > 半:全型兄弟,我們明明都是**表達同樣文字**,你怎麼看起來這麼腫? > 全:我腫!?你這個瘦皮猴!竟然這樣說我,<font color="red">**早出生**</font>就很了不起嗎? > 半:很棒啊,我可是<font color="red">**本來就存在的**</font>,又腫又落後的字體為何要存在? > 全:我怎麼知道?去問**電腦發展史**還比較有可能得到答案。 從上述對話中可以發現,代表**同樣意涵卻有不相同外型的文字** 資料來源千千百百種,真的每一種都會是共同認知的型態嗎? - 別人眼中認為的蘋果 :apple: - 自己眼中定義的蘋果 :green_apple: 同樣稱作「**蘋果**」的物品,真的都會同一形狀、顏色且同樣氣味嗎? --- #### Ⅰ. ASCII 在程式語言的世界中,說到**文字的始祖**不外乎就是ASCII表 電腦發展初期,基本上「英文」、「拉丁字母」為使用者的大宗 並且當時開發上,規定用8位長度的二進位表示一個字元,<font color="blue">**最多可以表示 2^8^=256 個字元**</font> 隨著工業革命、電腦普及,越來越多的語言使用者加入,存放的空間也由**一位元組升級二位元組** \<例如:中、日、韓文... 等等\> 直到至今,字體存放空間<font color="red">**已經不採用全、半形字體**</font>作為判斷基準 --- #### Ⅱ. UTF-8 為了彌補中、日、韓...等各國地區的非英文語系的語言支援 各國都開始各自向下擴充ANSII的字符表,從127開始向下延伸 - **簡體 : GB2313 -> GBK** - **繁體 : Big5** - **日本 : JIS C6226** 諸如此類的字型在各國內發展,就如雨後春筍一樣,沒有任何規範、規則 雖然**少部分有各自轉換規定的規則**,但是還是<font color="red">**無法統一將現有文字納入**</font> 因此ISO國際標準協會、IEC國際電工聯盟出來與大家討論,制定了 - **初版的ISO 10646** - **Unicode Constructium<font color="blue">\(後人稱UniCode,萬國碼\)</font>** 而 **Unicode** 也成為了現型電腦中,主流的文字字形交流的主要使用 :::info 有興趣可以參考頁面下方網站,還有介紹許多字元儲存的方式、區域 - <a href="#uniCode">**[延伸] 認識中文字元碼**</a> - <a href="#norCode">**[延伸] 常見的幾種編碼**</a> ::: --- ### 半形、全形轉換規則 首先先了解轉換規則,可以比照 ANSII、半全型字體區間之間的間隔問題 **<center><font color="red">(以下皆為HEX表示法)</font></center>** - ANSII : 0021 - 007E \(DEX表示:33 - 126\) - 全形 &nbsp; : FF01 - FF5E \(DEX表示:65281 - 65374\) 將兩段區間互相抵減後,**可以發現每個字元皆相差 65,248 的距離** 知道規則後,可在字串轉換上可以撰寫成以下兩種方式 - 半型 :arrow_right: 全型 ```C# public string convStrToWide(string str){ char[] chars = str.ToCharArray(); for(var i = 0; i < chars.Length; ++i ){ if(chars[i] > 32 && chars[i] < 127){ chars[i] = (char)(chars[i] + 65248) } } return new string(chars); } ``` - 全型 :arrow_right: 半型 ```C# public string convStrToNarrow(string str){ char[] chars = str.ToCharArray(); for(var i = 0; i < chars.Length; ++i ){ if(chars[i] > 65280 && chars[i] < 65375){ chars[i] = (char)(chars[i] - 65248) } } return new string(chars); } ``` **\[半型轉全型\]** 測試轉換結果如下:arrow_down: ![](https://i.imgur.com/M2iL4ye.png) 若**想轉換其他字元**,則須查詢半、全型區間位置還轉換規則 :::info :bulb: ASCII 32位元(空白)為半型,**全型位置為 12288** ::: --- ### :computer: 連結 <div class="link-Table"> | 參考網站 | 連結 | |:------------------------------------------------------- |:-----------------------------------------------------------------:| |Strings.StrConv半形全形轉換注意事項三則|[:link:][Strings.StrConv半形全形轉換注意事項三則]| |C#全角半角转换函数|[:link:][C#全角半角转换函数]| |深入 Microsoft.VisualBasic.Strings.StrConv 簡繁轉換|[:link:][深入 Microsoft.VisualBasic.Strings.StrConv 簡繁轉換]| |ASCII 對照表|[:link:][ASCII 對照表]| |Lua 删除UTf-8编码中的特殊字符|[:link:][Lua 删除UTf-8编码中的特殊字符]| |維基百科 - 全型/半型|[:link:][維基百科 - 全型/半型]| |概念 - 中文輸入法為什麼會有全形和半形的區別?|[:link:][概念 - 中文輸入法為什麼會有全形和半形的區別?]| |半形及全形字元 (Unicode區段)|[:link:][半形及全形字元 (Unicode區段)]| |<div id="norCode"></div>\[延伸\] 常見的幾種編碼(ANSI、GBK、GB2312、UTF-8、GB18030和 UNICODE)介紹|[:link:][常見的幾種編碼(ANSI、GBK、GB2312、UTF-8、GB18030和 UNICODE)介紹]| |<div id="uniCode"></div>\[延伸\] 認識中文字元碼 |[:link:][認識中文字元碼]| [Strings.StrConv半形全形轉換注意事項三則]: https://blog.darkthread.net/blog/strconv-half-full-width-notes/ [C#全角半角转换函数]:http://blog.itpub.net/12639172/viewspace-617610/ [深入 Microsoft.VisualBasic.Strings.StrConv 簡繁轉換]:http://sanchen.blogspot.com/2007/12/microsoftvisualbasicstringsstrconv.html [ASCII 對照表]:http://kevin.hwai.edu.tw/~kevin/material/JAVA/Sample2016/ASCII.htm [Lua 删除UTf-8编码中的特殊字符]:https://blog.csdn.net/SKY453589103/article/details/76337557 [維基百科 - 全型/半型]: https://zh.wikipedia.org/zh-tw/%E5%85%A8%E5%BD%A2%E5%92%8C%E5%8D%8A%E5%BD%A2 [概念 - 中文輸入法為什麼會有全形和半形的區別?]:https://www.getit01.com/p20180107319605819/ [半形及全形字元 (Unicode區段)]:https://zh.wikipedia.org/zh-tw/%E5%8D%8A%E5%BD%A2%E5%8F%8A%E5%85%A8%E5%BD%A2%E5%AD%97%E7%AC%A6_(Unicode%E5%8D%80%E6%AE%B5) [常見的幾種編碼(ANSI、GBK、GB2312、UTF-8、GB18030和 UNICODE)介紹]:https://www.796t.com/content/1510308261.html [認識中文字元碼]:https://idv.sinica.edu.tw/bear/charcodes/Section11.htm </div> <style> div.link-Table > table th:nth-of-type(1) { width: 80vw; } div.link-Table > table th:nth-of-type(2) { width: 10vw; } </style>