C#轉碼

來源:互聯網
上載者:User

            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]

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.