string unicodeString = "中國";
// Create two different encodings.
Encoding ascii = Encoding.ASCII;
Encoding unicode = Encoding.Unicode;
byte[] unicodeBytes = unicode.GetBytes(unicodeString);
byte[] asciiBytes = Encoding.Convert(unicode ascii, unicodeBytes);
如果要得到GB2312
Encoding Ansi = Encoding.GetEncoding("GB2312");
淺析unicode編碼utf8編碼和gb2312編碼之間的轉換關係
1.UCS代表Universal Character Set通用字元集
2.UTF代表UCS Transformation Format
3.gb2312編碼使用的是區位碼尋字方式,1-9區存放中文符號,16-55區存放一級漢字,56-87區存放二級漢字,如第1個漢字位於16區的第1位,為:'啊',所以1601,即0x1001就代表了該'啊'的區位碼值.
區位碼變換為機器內碼需要分別將區碼和位碼加0xA0,所以'啊'的機器內碼就是,0xB0A1
4.國際碼=區位碼+0x2020
機器內碼=國際碼+0x8080 也就是=區位碼+0xa0a0
>>> print unicode('\xb0\xa1', 'gb2312')//將機器內碼轉換為unicode碼
啊
>>> print unicode(chr(0xb0)+chr(0xa1), 'gb2312')
啊
>>> a=u'\u00a9'
>>> print a
>>> a.encode('utf-8')
'\xc2\xa9'
>>> print chr(65)
>>> print unichr(0x8089)
5.unicode對漢字進行了重新編碼,這和gb2312編碼的方式和順序完全不同,unicode對漢字編碼從0x4E00開始,到0x9FA5為止,所以unicode和gb2312編碼的轉換,就需要一個轉換對照表,實現快速轉換[luther.gliethttp]
6.wchar_t 類型可以用來存放 Unicode 字元.
在ubuntu下,使用
locale顯示系統的預設編碼
luther@gliethttp:~$ locale
LANG=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=
luther@gliethttp:~$ vim utf8.c
然後輸入:luther中國
儲存,查看儲存後,utf8.c的hex:
0000000: 6c 75 74 68 65 72 e4 b8 ad e5 9b bd 0a luther.......
使用python進一步分析查看:
>>> ord('\n')
10
>>> a='中國' //使用python預設編碼方案對漢字執行賦值儲存操作
>>> a
'\xe4\xb8\xad\xe5\x9b\xbd' //這就是utf-8編碼,所以這也就是我的ubutun下python預設編碼方案
>>> a=u'中國'//使用unicode編碼
>>> a
u'\u4e2d\u56fd' //這就是unicode編碼值
>>> a.encode('gb2312') //轉成gb2312的區位碼編碼值
'\xd6\xd0\xb9\xfa'
>>> a.encode('utf-8') //轉成utf-8編碼
'\xe4\xb8\xad\xe5\x9b\xbd' //和上面python的預設編碼值相同
>>> a=u'中國'
u'\u4e2d\u56fd'
>>> b=a.encode('gb2312')//unicode轉為gb2312
>>> b
'\xd6\xd0\xb9\xfa'
>>> unicode(b, 'gb2312')//將gb2312轉為unicode
u'\u4e2d\u56fd'
顯示unicode字元的utf8碼
>>> u'葛'
u'\u845b'
列印utf8碼為可視字元
>>> print u'\u845b'
葛
[註:以下內容轉自:http://www.ixpub.net/thread-865394-1-1.html]
UTF-8
現在明白了Unicode,那麼UTF-8又是什麼呢?又為什麼會出現UTF-8呢?
ASCII轉換成UCS-2,只是在編碼前插入一個0x0。用這些編碼,會包括一些控制符,比如 '' 或 '/',這在UNIX和一些C函數中,將會產生嚴重錯誤。因此可以肯定,UCS-2不適合作為Unicode的外部編碼。
因此,才誕生了UTF-8。那麼UTF-8是如何編碼的?又是如何解決UCS-2的問題呢?
例:
E4 BD A0 11100100 10111101 10100000
這是“你”字的UTF-8編碼
4F 60 01001111 01100000
這是“你”的Unicode編碼
按照UTF-8的編碼規則,分解如下:xxxx0100 xx111101 xx100000
把除了x之外的數字拼接在一起,就變成“你”的Unicode編碼了。
注意UTF-8的最前面3個1,表示整個UTF-8串是由3個位元組構成的。
經過UTF-8編碼之後,再也不會出現敏感字元了,因為最高位始終為1。
以下是Unicode和UTF-8之間的轉換關係表:
U-00000000 - U-0000007F: 0xxxxxxx //沒有1表示只有1個位元組
U-00000080 - U-000007FF: 110xxxxx 10xxxxxx //前面2個1表示由2個位元組
U-00000800 - U-0000FFFF: 1110xxxx 10xxxxxx 10xxxxxx //前面3個1表示由3個位元組
U-00010000 - U-001FFFFF: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx //依次類推
U-00200000 - U-03FFFFFF: 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
U-04000000 - U-7FFFFFFF: 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
Unicode編碼轉換到UTF-8,簡單的把Unicode位元組流套到x中就變成UTF-8了。
所以,可以看到unicode編碼和utf-8編碼有線性轉換關係,而unicode編碼和gb2312編碼不存線上性轉換關係,所以我們必須使用對照表來進行unicode和gb2312編碼的互換,就像陽曆和農曆轉換演算法一樣,不能作線性計算[luther.gliethttp]