精华内容
下载资源
问答
  • [VC++]UTF8与ASCII格式互转

    千次阅读 2011-03-01 15:05:00
    [VC++]UTF8与ASCII格式互转

    first   convert   UTF-8   to   widechar,   then   convert   widechar   to   ANSI.
    here   is   code   snippets   converting   ANSI   to   UTF-8


    CString   aaa= "abc ";//CP_ACP   CP_UTF8
    wchar_t   wbuf[128];
    ZeroMemory(wbuf,sizeof(wbuf));
    int   nret=MultiByteToWideChar(CP_ACP,0,aaa,aaa.GetLength()+1,wbuf,sizeof(wbuf)/sizeof(wbuf[0]));
    if(nret> 0&&nret <sizeof(wbuf))
    {
    CFile   foutput;
    foutput.Open( "c://widechar.htm ",CFile::modeCreate|CFile::modeWrite);
    foutput.Write(wbuf,nret*2);
    foutput.Flush();
    foutput.Close();
    }

     


    char   uft8buf[1024];
    BOOL   busedefault=false;
    nret   =   WideCharToMultiByte(CP_UTF8,0,wbuf,nret,uft8buf,sizeof(uft8buf),NULL,NULL);
    if(nret> 0&&nret <sizeof(uft8buf))
    {
    CFile   foutput;
    foutput.Open( "c://utf8.htm ",CFile::modeCreate|CFile::modeWrite);
    foutput.Write(uft8buf,nret);
    foutput.Flush();
    foutput.Close();
    }

     

     

     

    VcunicodeUTF8相互转换

    vc下使用SQLite数据库时,由于SQL语句使用utf8 编码,而CString unicode编码。

    一,utf8 Unicode

    CString UTF8ToUnicode(char* UTF8)

    {

         DWORD dwUnicodeLen;        //转换后Unicode的长度

         TCHAR *pwText;            //保存Unicode的指针

         CString strUnicode;        //返回值

     

         //获得转换后的长度,并分配内存

         dwUnicodeLen = MultiByteToWideChar(CP_UTF8,0,UTF8,-1,NULL,0);

         pwText = new TCHAR[dwUnicodeLen];

         if (!pwText)

         {

             return strUnicode;

         }

     

         //转为Unicode

         MultiByteToWideChar(CP_UTF8,0,UTF8,-1,pwText,dwUnicodeLen);

     

         //转为CString

         strUnicode.Format(_T("%s"),pwText);

     

         //清除内存

         delete []pwText;

     

         //返回转换好的Unicode字串

         return strUnicode;

    }

     

    二,Unicodeutf8

    size_t CDGQDialog::g_f_wctou8(char * dest_str, const wchar_t src_wchar)

    {

         int count_bytes = 0;

         wchar_t byte_one = 0, byte_other = 0x3f; // 用于位与运算以提取位值0x3f--->00111111

         unsigned char utf_one = 0, utf_other = 0x80; // 用于"位或"置标UTF-8编码0x80--->1000000

         wchar_t tmp_wchar =L'0'; // 用于宽字符位置析取和位移(右移位)

         unsigned char tmp_char =L'0';

     

         if (!src_wchar)//

             return (size_t)-1;

     

         for (;;) // 检测字节序列长度

         {

             if (src_wchar <= 0x7f){ // <=01111111

                  count_bytes = 1; // ASCII字符: 0xxxxxxx( ~ 01111111)

                  byte_one = 0x7f; // 用于位与运算, 提取有效位值, 下同

                  utf_one = 0x0;

                  break;

             }

             if ( (src_wchar > 0x7f) && (src_wchar <= 0x7ff) ){ // <=0111,11111111

                  count_bytes = 2; // 110xxxxx 10xxxxxx[1](最多个位, 简写为*1)

                  byte_one = 0x1f; // 00011111, 下类推(1位的数量递减)

                  utf_one = 0xc0; // 11000000

                  break;

             }

             if ( (src_wchar > 0x7ff) && (src_wchar <= 0xffff) ){ //0111,11111111<=11111111,11111111

                  count_bytes = 3; // 1110xxxx 10xxxxxx[2](MaxBits: 16*1)

                  byte_one = 0xf; // 00001111

                  utf_one = 0xe0; // 11100000

                  break;

             }

             if ( (src_wchar > 0xffff) && (src_wchar <= 0x1fffff) ){ //UCS-4的支持..

                  count_bytes = 4; // 11110xxx 10xxxxxx[3](MaxBits: 21*1)

                  byte_one = 0x7; // 00000111

                  utf_one = 0xf0; // 11110000

                  break;

             }

             if ( (src_wchar > 0x1fffff) && (src_wchar <= 0x3ffffff) ){

                  count_bytes = 5; // 111110xx 10xxxxxx[4](MaxBits: 26*1)

                  byte_one = 0x3; // 00000011

                  utf_one = 0xf8; // 11111000

                  break;

             }

             if ( (src_wchar > 0x3ffffff) && (src_wchar <= 0x7fffffff) ){

                  count_bytes = 6; // 1111110x 10xxxxxx[5](MaxBits: 31*1)

                  byte_one = 0x1; // 00000001

                  utf_one = 0xfc; // 11111100

                  break;

             }

             return (size_t)-1; // 以上皆不满足则为非法序列

         }

         // 以下几行析取宽字节中的相应位, 并分组为UTF-8编码的各个字节

         tmp_wchar = src_wchar;

         for (int i = count_bytes; i > 1; i--)

         { // 一个宽字符的多字节降序赋值

             tmp_char = (unsigned char)(tmp_wchar & byte_other);///后位与byte_other 00111111

             dest_str[i - 1] = (tmp_char | utf_other);/// 在前面加----跟或

             tmp_wchar >>= 6;//右移位

         }

         //这个时候i=1

         //UTF-8第一个字节位处理,

         //第一个字节的开头"1"的数目就是整个串中字节的数目

         tmp_char = (unsigned char)(tmp_wchar & byte_one);//根据上面附值得来,有效位个数

         dest_str[0] = (tmp_char | utf_one);//根据上面附值得来1的个数

         // 位值析取分组__End!

         return count_bytes;

    }

    int CDGQDialog::g_f_wcs_to_pchar(CString& wstr,char * p)

    {

         wchar_t wc=L'1';

         char c[10]="1";//申请一个缓存

         size_t r=0; //size_t unsigned integer Result of sizeof operator

         int i=0;

         int j=0;

         for(i=0;i<wstr.GetLength();i++)

         {

             wc=wstr.GetAt(i);//得到一个宽字符

             r=g_f_wctou8(c,wc);//将一个宽字符按UTF-8格式转换到p地址

             if(r==-1)//出错判断

                  AfxMessageBox(_T("wcs_to_pchar error"));

             p[j]=c[0];//第一个值附给p

             j++;

             if(r>1)

             {

                  for(size_t x=1;x<r;x++)

                  {

                       p[j]=c[x];

                       j++;

                  }

             }

         }

         //p[j]='0';

         return 1;

     

    }

    三.转换实例

    void CMytestDlg::OnBnClickedButton2()

    {

         // TODO: 在此添加控件通知处理程序代码

         CString ccId=L"2007071";

         CString sql;

         char mySql[100];

         memset(mySql,0,sizeof(mySql));

         sql.Format(L"select cxrq,cxdw,dxrq,dxdw,fxrq,fxdw,cx,flx from j_clxx where trainnum_info_id ='%s'",ccId);

         //wchar_t sql=L'';

         g_f_wcs_to_pchar(sql,mySql);

         CString sql1 =UTF8ToUnicode(mySql);

         MessageBox(sql);

         //g_f_wctou8(mySql,sql);

    //  CString str_temp;

    //  for (int i=90;i<strlen(mySql);i++)

    //  {

    //       str_temp.Format(L"%c",mySql[i]);

    //       MessageBox(str_temp);

    //  }

     

    展开全文
  • 开发的过程中,最好使用统一的编码格式,推荐使用utf-8。如果涉及到开发环境,显示界面和数据库之间的编解码问题,可以使用下面的方法进行编码转换,下面的方法是python中的编解码的方法 1. utf-8转成unicode: str....
     
    开发的过程中,最好使用统一的编码格式,推荐使用utf-8。如果涉及到开发环境,显示界面和数据库之间的编解码问题,可以使用下面的方法进行编码转换,下面的方法是python中的编解码的方法
    1.
    utf-8转成unicode:
    str.decode(‘utf-8’)

    2.unicode编码成utf-8:
    unicode(str).encode(‘utf-8’)

     一直对字符的各种编码方式懵懵懂懂,什么ANSI、UNICODE、UTF-8、GB2312、GBK、DBCS、UCS……是不是看的很晕,假如您细细的阅读本文你一定可以清晰的理解他们。

    一.ASCII码        
        很久很久以前,有一群人,他们决定用8个可以开合的晶体管来组合成不同的状态,以表示世界上的万物。他们看到8个开关状态是好的,于是他们把这称为”字节”。
        再后来,他们又做了一些可以处理这些字节的机器,机器开动了,可以用字节来组合出很多状态,状态开始变来变去。他们看到这样是好的,于是它们就把这机器称为”计算机”。
        开始计算机只在美国用。八位的字节一共可以组合出256(2的8次方)种不同的状态。
        他们把其中的编号从0开始的32种状态分别规定了特殊的用途,一但终端、打印机遇上约定好的这些字节被传过来时,就要做一些约定的动作。遇上00x10, 终端就换行,遇上0x07, 终端就向人们嘟嘟叫,例如遇上0x1b, 打印机就打印反白的字,或者终端就用彩色显示字母。他们看到这样很好,于是就把这些0x20以下的字节状态称为”控制码”。
        他们又把所有的空格、标点符号、数字、大小写字母分别用连续的字节状态表示,一直编到了第127号,这样计算机就可以用不同字节来存储英语的文字了。大家看到这样,都感觉很好,于是大家都把这个方案叫做 ANSI 的”Ascii”编码(American Standard Code for Information Interchange,美国信息互换标准代码)。当时世界上所有的计算机都用同样的ASCII方案来保存英文文字。
        后来,就像建造巴比伦塔一样,世界各地的都开始使用计算机,但是很多国家用的不是英文,他们的字母里有许多是ASCII里没有的,为了可以在计算机保存他们的文字,他们决定采用127号之后的空位来表示这些新的字母、符号,还加入了很多画表格时需要用到的横线、竖线、交叉等形状,一直把序号编到了最后一个状态255。从128到255这一页的字符集被称”扩展字符集”。从此之后,贪婪的人类再没有新的状态可以用了,美帝国主义可能没有想到还有第三世界国家的人们也希望可以用到计算机吧!

    二.GB2312/GBK     
        等中国人们得到计算机时,已经没有可以利用的字节状态来表示汉字,况且有6000多个常用汉字需要保存呢。但是这难不倒智慧的中国人民,我们不客气地把那些127号之后的奇异符号们直接取消掉,
        规定:一个小于127的字符的意义与原来相同,但两个大于127的字符连在一起时,就表示一个汉字,前面的一个字节(他称之为高字节)从0xA1用到 0xF7,后面一个字节(低字节)从0xA1到0xFE,这样我们就可以组合出大约7000多个简体汉字了。在这些编码里,我们还把数学符号、罗马希腊的字母、日文的假名们都编进去了,连在 ASCII 里本来就有的数字、标点、字母都统统重新编了两个字节长的编码,这就是常说的”全角”字符,而原来在127号以下的那些就叫”半角”字符了。
        中国人民看到这样很不错,于是就把这种汉字方案叫做”GB2312”。GB2312 是对 ASCII 的中文扩展。
        但是中国的汉字太多了,我们很快就就发现有许多人的人名没有办法在这里打出来,特别是某些很会麻烦别人的国家领导人。于是我们不得不继续把GB2312 没有用到的码位找出来老实不客气地用上。
        后来还是不够用,于是干脆不再要求低字节一定是127号之后的内码,只要第一个字节是大于127就固定表示这是一个汉字的开始,不管后面跟的是不是扩展字符集里的内容。结果扩展之后的编码方案被称为 GBK 标准,GBK 包括了 GB2312 的所有内容,同时又增加了近20000个新的汉字(包括繁体字)和符号。
        后来少数民族也要用电脑了,于是我们再扩展,又加了几千个新的少数民族的字,GBK 扩成了GB18030。从此之后,中华民族的文化就可以在计算机时代中传承了。
        中国的程序员们看到这一系列汉字编码的标准是好的,于是通称他们叫做”DBCS”(Double Byte Charecter Set 双字节字符集)。在DBCS系列标准里,最大的特点是两字节长的汉字字符和一字节长的英文字符并存于同一套编码方案里,因此他们写的程序为了支持中文处理,必须要注意字串里的每一个字节的值,如果这个值是大于127的,那么就认为一个双字节字符集里的字符出现了。那时候凡是会编程的计算机僧侣们都要每天念下面这个咒语数百遍:
        “一个汉字算两个英文字符!一个汉字算两个英文字符……”

    三.Unicode 
           
        因为当时各个国家都像中国这样搞出一套自己的编码标准,结果互相之间谁也不懂谁的编码,谁也不支持别人的编码,连大陆和台湾这样只相隔了150海里,使用着同一种语言的兄弟地区,也分别采用了不同的 DBCS 编码方案——当时的中国人想让电脑显示汉字,就必须装上一个”汉字系统”,专门用来处理汉字的显示、输入的问题,但是那个台湾的愚昧封建人士写的算命程序就必须加装另一套支持BIG5  编码的什么”倚天汉字系统”才可以用,装错了字符系统,显示就会乱了套!这怎么办?而且世界民族之林中还有那些一时用不上电脑的穷苦人民,他们的文字又怎么办?
        真是计算机的巴比伦塔命题啊!
        正在这时,大天使加百列及时出现了——一个叫 ISO(国际标谁化组织)的国际组织决定着手解决这个问题。他们采用的方法很简单:废了所有的地区性编码方案,重新搞一个包括了地球上所有文化、所有字母和符号的编码!他们打算叫它”Universal Multiple-Octet Coded Character Set”,简称 UCS, 俗称 “UNICODE”。
        UNICODE 开始制订时,计算机的存储器容量极大地发展了,空间再也不成为问题了。于是 ISO 就直接规定必须用两个字节,也就是16位来统一表示所有的字符,对于ascii里的那些“半角”字符,UNICODE 包持其原编码不变,只是将其长度由原来的8位扩展为16位,而其他文化和语言的字符则全部重新统一编码。由于”半角”英文符号只需要用到低8位,所以其高 8位永远是0,因此这种大气的方案在保存英文文本时会多浪费一倍的空间。
        这时候,从旧社会里走过来的程序员开始发现一个奇怪的现象:他们的strlen函数靠不住了,一个汉字不再是相当于两个字符了,而是一个!是的,从UNICODE 开始,无论是半角的英文字母,还是全角的汉字,它们都是统一的”一个字符”!同时,也都是统一的”两个字节”,请注意”字符”和”字节”两个术语的不同,“字节”是一个8位的物理存贮单元,而“字符”则是一个文化相关的符号。在UNICODE 中,一个字符就是两个字节。一个汉字算两个英文字符的时代已经快过去了。
        从前多种字符集存在时,那些做多语言软件的公司遇上过很大麻烦,他们为了在不同的国家销售同一套软件,就不得不在区域化软件时也加上那个双字节字符集咒语,不仅要处处小心不要搞错,还要把软件中的文字在不同的字符集中转来转去。UNICODE 对于他们来说是一个很好的一揽子解决方案,于是从Windows NT 开始,MS 趁机把它们的操作系统改了一遍,把所有的核心代码都改成了用UNICODE 方式工作的版本,从这时开始,WINDOWS 系统终于无需要加装各种本土语言系统,就可以显示全世界上所有文化的字符了。
        但是,UNICODE 在制订时没有考虑与任何一种现有的编码方案保持兼容,这使得 GBK 与UNICODE 在汉字的内码编排上完全是不一样的,没有一种简单的算术方法可以把文本内容从UNICODE编码和另一种编码进行转换,这种转换必须通过查表来进行。
        如前所述,UNICODE 是用两个字节来表示为一个字符,他总共可以组合出65535不同的字符,这大概已经可以覆盖世界上所有文化的符号。如果还不够也没有关系,ISO已经准备了UCS-4方案,说简单了就是四个字节来表示一个字符,这样我们就可以组合出21亿个不同的字符出来(最高位有其他用途),这大概可以用到银河联邦成立那一天吧!
        unicode可以是两个字节或是4个字节。目前的用于实用的Unicode版本对应于UCS-2,使用16位的编码空间。也就是每个字符占用2个字节。unicode使用4字节的,叫ucs-4。

    四.UTF-8  

        UTF8并不算是一种电脑编码,而是一种储存和传送的格式,如前所述,每个Unicode/UCS字符都以 2或4个bytes来储存,看看以下的比较:

    以”I am Chinese”为例:
    用ANSI储存:12 Bytes
    用Unicode/UCS2储存:24 Bytes + 2 Bytes(header)
    用UCS4储存:48 Bytes + 4 Bytes(header)

    以”我是中国人”为例:
    用ANSI储存:10 Bytes
    用Unicode/UCS2储存:10 Bytes + 2 Bytes(header)
    用UCS4储存:20 Bytes + 4 Bytes(header)

        由此可见直接以Unicode/UCS的原始形式来储存是一种极大的浪费,而且也不利于互联网的传输(中文稍为合算一点。Unicode/UCS的压缩形式--UTF8出现了,套用官方网站的首句话『UTF-8 stands for Unicode Transformation Format-8. It is an octet (8-bit) lossless encoding of Unicode characters.』,由于UTF也适用于编码UCS,故亦可称为『UCS transformation formats (UTF)』
        UTF8是以8bits即1Bytes为编码的最基本单位,当然也可以有基于16bits和32bits的形式,分别称为UTF16和UTF32,但目前用得不多,而UTF8则被广泛应用在文件储存和网络传输中。
        事实证明,对可以用ASCII表示的字符使用UNICODE并不高效,因为UNICODE比ASCII占用大一倍的空间,而对ASCII来说高字节的0对他毫无用处。为了解决这个问题,就出现了一些中间格式的字符集,他们被称为通用转换格式,即UTF(Universal Transformation Format)。目前存在的UTF格式有:UTF-7, UTF-7.5, UTF-8, UTF-16, 以及 UTF-32。
        UNICODE 来到时,一起到来的还有计算机网络的兴起,UNICODE 如何在网络上传输也是一个必须考虑的问题,于是面向传输的众多 UTF(UCS Transfer Format)标准出现了,顾名思义,UTF8就是每次8个位传输数据,而UTF16就是每次16个位,只不过为了传输时的可靠性,从UNICODE到 UTF时并不是直接的对应,而是要过一些算法和规则来转换。
        受到过网络编程的计算机僧侣们都知道,在网络里传递信息时有一个很重要的问题,就是对于数据高低位的解读方式,一些计算机是采用低位先发送的方法,例如我们PC机采用的 INTEL 架构,而另一些是采用高位先发送的方式,在网络中交换数据时,为了核对双方对于高低位的认识是否是一致的,采用了一种很简便的方法,就是在文本流的开始时向对方发送一个标志符——如果之后的文本是高位在位,那就发送”FEFF”,反之,则发送”FFFE”。不信你可以用二进制方式打开一个UTF-X格式的文件,看看开头两个字节是不是这两个字节?
        讲到这里,我们再顺便说说一个很著名的奇怪现象:当你在windows 的记事本里新建一个文件,输入”联通”两个字之后,保存,关闭,然后再次打开,你会发现这两个字已经消失了,代之的是几个乱码!呵呵,有人说这就是联通之所以拼不过移动的原因。
        其实这是因为GB2312编码与UTF8编码产生了编码冲撞的原因。
        从网上引来一段从UNICODE到UTF8的转换规则,这里的unicode是使用2字节的unicode,即ucs-2。
    即ucs-2和utf-8的转换规则

    Unicode(ucs-2)

    Utf-8

    0000 - 007F

    0xxxxxxx

    0080 - 07FF

    110xxxxx 10xxxxxx

    0800 - FFFF

    1110xxxx 10xxxxxx 10xxxxxx


          如果unicode是ucs-2,则utf-8的长度为1-3个字节;如果unicode是ucs-4,则utf-8的长度是1-6个字节,第一个字节的高位1的数目指明了这个utf-8的字符使用的byte数目。

          例如”汉”字的Unicode编码是6C49。6C49在0800-FFFF之间,所以要用3字节模板:1110xxxx 10xxxxxx 10xxxxxx。将6C49写成二进制是:0110 1100 0100 1001,将这个比特流按三字节模板的分段方法分为0110 110001 001001,依次代替模板中的x,得到:1110-0110 10-110001 10-001001,即E6 B1 89,这就是其UTF8的编码。
          而当你新建一个文本文件时,记事本的编码默认是ANSI,如果你在ANSI的编码输入汉字,那么他实际就是GB系列的编码方式,在这种编码下,”联通”的内码是:
                c1: 1100 0001
                aa: 1010 1010
                cd: 1100 1101
                a8: 1010 1000
          注意到了吗?第一二个字节、第三四个字节的起始部分的都是”110”和”10”,正好与UTF8规则里的两字节模板是一致的,于是再次打开记事本时,记事本就误认为这是一个UTF8编码的文件,让我们把第一个字节的110和第二个字节的10去掉,我们就得到了”00001 101010”,再把各位对齐,补上前导的0,就得到了”0000 0000 0110 1010”,不好意思,这是UNICODE的006A,也就是小写的字母”j”,而之后的两字节用UTF8解码之后是0368,这个字符什么也不是。这就是只有”联通”两个字的文件没有办法在记事本里正常显示的原因。
          而如果你在”联通”之后多输入几个字,其他的字的编码不见得又恰好是110和10开始的字节,这样再次打开时,记事本就不会坚持这是一个utf8编码的文件,而会用ANSI的方式解读之,这时乱码又不出现了。

         下面给出ucs-4和utf-8的转化关系:

    Unicode(ucs-4)

    Utf-8

    0000 0000 - 0000 007F

    0xxxxxxx

    0000 0080 - 0000 07FF

    110xxxxx 10xxxxxx

    0000 0800-0000 FFFF

    1110xxxx 10xxxxxx 10xxxxxx

    0001 0000-001F FFFF

    11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

    0020 0000-03FF FFFF

    111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx

    0400 0000-7FFF FFFF

    1111110x 10xxxxxx 10xxxxxx

    编码步骤:
    1) 首先确定需要多少个8bits(octets)
    2) 按照上述模板填充每个octets的高位bits
    3) 把字符的bits填充至x中,字符顺序:低位→高位,UTF8顺序:最后一个octet的最末位x→第一个octet最高位x
    4) 解码的原理一样。

         好了,终于可以回答NICO的问题了,在数据库里,有n前缀的字串类型就是UNICODE类型,这种类型中,固定用两个字节来表示一个字符,无论这个字符是汉字还是英文字母,或是别的什么。例如:nvarchar就是具有n前缀的子串类型,是unicode类型。
         如果你要测试“abc汉字”这个串的长度,在没有n前缀的数据类型里,这个字串是7个字符的长度,因为一个汉字相当于两个字符。而在有n前缀的数据类型里,同样的测试串长度的函数将会告诉你是5个字符,因为一个汉字就是一个字符。   

    效率

    从上述编码原理中得出的结论是:

    1.每个英文字母、数字所占的空间为1 Byte;

    2.泛欧语系、斯拉夫语字母占2 Bytes;

    3.汉字占3 Bytes。


    UTF8的好处:

    数据表现:网页可以显示任何语言和文字,只要你的操作系统支持unicode,还有相应的字体,Linux下系统编码为utf8的话,可以解决很多无谓的中文问题,比如mp3播放器或者gtk2.

    数据交换:无需那些gb2312和big5之间的转换程序了.

    PHP里著名的”許功蓋”问题,smarty的问题,都可以很好的解决,这方面的以后扩展来介绍:


    UTF8的坏处:

    用的中文网站还不多,不利于数据交流.

    汉字为三个字符,有时varchar不大够用.


    展开全文
  • UTF-8与ASCII与Unicode

    2019-12-30 14:50:37
    它可以用来表示Unicode标准中的任何字符,而且其编码中的第一个字节仍与ASCII相容,使得原来处理ASCII字符的软件无须或只进行少部份修改后,便可继续使用。因此,它逐渐成为电子邮件、网页及其他存储或传送文字的...

    #UTF-8
    UTF-8(8位元,Universal Character Set/Unicode Transformation Format)是针对Unicode的一种可变长度字符编码。它可以用来表示Unicode标准中的任何字符,而且其编码中的第一个字节仍与ASCII相容,使得原来处理ASCII字符的软件无须或只进行少部份修改后,便可继续使用。因此,它逐渐成为电子邮件、网页及其他存储或传送文字的应用中,优先采用的编码。

    UTF-8的特点是对不同范围的字符使用不同长度的编码。对于0x00-0x7F之间的字符,UTF-8编码与ASCII编码完全相同。UTF-8编码的最大长度是4个字节。从上表可以看出,4字节模板有21个x,即可以容纳21位二进制数字。Unicode的最大码位0x10FFFF也只有21位。
    例1:“汉”字的Unicode编码是0x6C49。0x6C49在0x0800-0xFFFF之间,使用3字节模板:1110xxxx 10xxxxxx 10xxxxxx。将0x6C49写成二进制是:0110 1100 0100 1001, 用这个比特流依次代替模板中的x,得到:11100110 10110001 10001001,即E6 B1 89。
    例2:Unicode编码0x20C30在0x010000-0x10FFFF之间,使用4字节模板:11110xxx 10xxxxxx 10xxxxxx 10xxxxxx。将0x20C30写成21位二进制数字(不足21位就在前面补0):0 0010 0000 1100 0011 0000,用这个比特流依次代替模板中的x,得到:11110000 10100000 10110000 10110000,即F0 A0 B0 B0。

    #ASCII
    ASCII ((American Standard Code for Information Interchange): 美国信息交换标准代码)是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其他西欧语言。它是最通用的信息交换标准,并等同于国际标准ISO/IEC 646。ASCII第一次以规范标准的类型发表是在1967年,最后一次更新则是在1986年,到目前为止共定义了128个字符 [1] 。
    在这里插入图片描述
    #Unicode
    Unicode(统一码、万国码、单一码)是计算机科学领域里的一项业界标准,包括字符集、编码方案等。Unicode 是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。1990年开始研发,1994年正式公布。
    Unicode是国际组织制定的可以容纳世界上所有文字和符号的字符编码方案。目前的Unicode字符分为17组编排,0x0000 至 0x10FFFF,每组称为平面(Plane),而每平面拥有65536个码位,共1114112个。然而目前只用了少数平面。UTF-8、UTF-16、UTF-32都是将数字转换到程序数据的编码方案。

    展开全文
  • unicode utf-8 ascii 区别联系

    千次阅读 2014-08-28 10:42:22
    unicode utf-8 ascii 区别联系

    unicode是一种标准,utf-8是这种标准的一种编码方式,ascii也是一种编码方式,

    一个汉字在unicode标准中占两个byte

    中文汉字的unicode范围:4E00~9FA5

    一个汉字在utf-8编码中占三个byte

    中文汉字的utf-8编码范围:E4B880~E9BEA0

    计算机中都是以字符流(byte)进行传输的,因此判定段字符流中的某一个是否是汉字,只需首先确定其是utf-8编码,然后判定其范围在E4B880~E9BEA0中即可

    展开全文
  • 如何让人类字符使计算机可识别? 众所周知,最直接的和计算机进行交互只能...接下来我将向宁介绍三种方法,分别是Unicode,UTF-8ASCII Ascii Ascii,又称美国信息交换标准代码,是目前最通用的信息交换标准,也...
  • ASCII码首先,我们大概都理解的是目前我们所见到的文本都是计算机处理过显示出来的,实际上计算机只能存储的是数字,要处理文本,就必须将文本数字进行转换处理。而我们都知道,在计算机中,8个计算机能识...
  • UTF_8 ASCII之间的转换

    千次阅读 2016-12-21 16:12:02
    //使用:Convert(strA_in,strB_out,CP_UTF8,CP_ACP)//UTF8转换ANSI // Convert(strA_out, strB_in, CP_ACP, CP_UTF8)//ANSI转换UTF8 void Convert(const char* strIn, char* strOut, int sourceCodepage, int ...
  • 文件格式修改UTF-8与ASCII,GBK等等,某些软件不能呢个自动识别,可以使用这个软件来转换
  • 在最初的时候,Internet上只有一种字符集——ANSI的ASCII字符集,它使用7 bits来表示一个字符,总共表示128个字符,其中包括了英文字母、数字、标点符号等常用字符。 后来,由于各国语言的加入,ASCII已经不能满足...
  • UTF与ascii区别

    2016-05-09 21:26:00
    由于世界各地有很多语言,ascii8个位不够用,世界各国就扩展位来表示他们当地语言,导致一个字符的位数不一样,于是iso就制定了UTF来统一标准。 参考:...
  • 字符串UTF-8与ASCII相互转换 收藏 LPSTR Convert(LPCSTR str, int sourceCodepage, int targetCodepage){ int len=_tcslen(str); int unicodeLen=MultiByteToWideChar(sourceCodepage,0,str,-1,NULL,0); wchar_t*...
  • UTF-8ASCII

    千次阅读 2013-01-21 19:18:41
    UTF-8和US-ASCII的区别 ...普通的多字节编码不同,UTF-8的字节长度不固定,对于ASCII, 字节长度为1, 对于中文,阿拉伯文等,可以是2,3或更多字节,这样能有效节省存储空间. 它还很多传统编码标准兼容,所以很受欢迎.
  • ASCIIUTF-8 字符互相转换
  • ASCII Unicode UTF-8 UTF-16 UTF-32ASCII码UnicodeUTF-8UTF-16UTF-32 计算机内部使用二进制数。一个字符在计算机中是以0和1构成的序列的形式来存储的。将字符映射到它的二进制形式的过程称为编码(encoding)。字符...
  • 1.ASCII编码 我们知道,在计算机内部,所有的信息最终都表示为一个二进制的字符串。每一个二进制位(bit)有0和1两种状态,因此八个二进制位就可以组合出256种状态,这被称为一个字节(byte)。也就是说,一个字节...
  • UTF-8与ASCII(GB2312)之互转

    千次阅读 2009-05-20 16:50:00
    最近写一个小程序IPSwitcher时用到tinyXML,这个类可以读出UTF-8的XML,但是如果让它生成XML文件(SaveFile),则是用ASCII方式,这时一旦加入中文则浏览器无法解析。因此需要先将中文转换成UTF-8写入。 另外以前的...
  • ASCIIUTF-8

    2021-02-04 09:56:00
    记录下ASCIIUTF-8的区别 摘抄自:ascii_unicode_and_utf-8 一、ASCII 计算机内部,所有信息最终都是一个二进制值。每一个二进制位(bit)有0和1两种状态,因此八个二进制位就可以组合出256种状态,这被称为一个...
  • java-day3-ASCII与Unicode的区别 何为UTF8、UTF16、UTF32 最大区别:ASCII是一个字节,而Unicode是两个字节(生僻字四个字节) ASCII:最早只有127个字母被变异到计算机中,也就是大小写英文字母、...
  • UTF-8, ASCII, Unicode的介绍区分

    千次阅读 2019-01-27 21:57:41
    文章出自个人博客https://knightyun.github.io/2019/01/27/ascii-unicode,转载请申明 背景 人类能通过肉眼识别文字和字符,并能通过知识了解他们的含义,但是计算机内部不论存储还是控制,都是通过二进制码实现,...
  • UNICODE与ASCII的区别  最早只有127个字母被编码到计算机里,也就是大小写英文字母、数字和一些符号,这个编码表被称为ASCII编码,比如大写字母A的编码是65,小写字母z的编码是122。  但是要处理中文显然一个...
  • ASCII,UNICODE与UTF-8

    2016-08-01 10:01:49
    信息在内存中是以二进制形式存放的,日常使用的文字和...阮一峰的那篇《字符编码笔记:ASCII,Unicode和UTF-8》还不错,但因为windows的命名混乱(比如将带BOM的UTF-16称作UNICODE,将windows code page称作ANSI)试图用
  • ASCII,UTF8,UTF16编码

    2015-01-18 22:09:00
    学点编码知识又不会死:Unicode的流言终结者和编码大揭秘 你真的理解编码吗?...UTF8 UTF16 编码 【转】UTF16和UTF8什么区别? UTF8和UTF16和UTF32之间的相互转化(ConvertUTF.c Conv...
  • 字符编码:ASCII UTF-8编码

    千次阅读 2018-10-04 22:42:09
    字符编码:ASCII UTF-8 编码 在计算机内部,所有的数据都是以二进制0、1表示,每个二进制位为一个比特(Bit),但是一个Bit能表示的信息太少,所以一个最小的操作单位应该包含多个多个比特,起初这个单位并没有...
  • UTF-8变长度的,最多 6 个字节,小于 127 的字符用一个字节表示, ASCII 字符集的结果一样,ASCII 编码下的英语文本不需要修改就可以当作 UTF-8 编码进行处理。Python 从 2.2 开始支持 Unicode ,函数 deco...
  • UTF-88-bit Unicode Transformation Format)是一种针对Unicode的可变长度字符编码,又称万国码。由Ken Thompson于1992年创建。现在已经标准化为RFC 3629。UTF-8用1到6个字节编码UNICODE字符。用在网页上可以同一...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,972
精华内容 788
关键字:

utf8与ascii