zoukankan      html  css  js  c++  java
  • C#转码


                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]

  • 相关阅读:
    Bash : 冒泡排序
    Azure Load Balancer : 支持 IPv6
    Azure Load Balancer : 简介
    sudo 与输出重定向
    Linux lsof 命令
    Bash : IO 重定向
    LVM : 快照
    2014年全年总结
    使用Kindle4rss推送自己感兴趣的博文
    换SSD硬盘,重装系统,一阵子忙乱
  • 原文地址:https://www.cnblogs.com/cuihongyu3503319/p/1459460.html
Copyright © 2011-2022 走看看