1.  字符编码 (Character encoding)

在存储和传递文本过程中,为了使得所有电脑都能够正确的识别出文本内容,需要有一个统一的规则。

   2. 字符集 (Character Set) )

一般情况,一种编码方式对应一种字符集。如 ASCII,对应 ASCII 字符集。GBK 编码方式对应 GBK 字符集。但是也有一种编码方式,多种字符集的,Unicode 字符集有多种编码方式,如 utf-8,utf-16 等。

   3.  ASCII

ASCII(American Standard Code for Information Interchange,美国信息交换标准代码):使用 7 个 Bit 表示,共 128 个字符,刚好占用了一个字节中的后 7 位,共包括33 个控制字符和 95 个可显示字符。
.   4.  ANSI
ANSI (一种字符编码,此处不是表示美国国家标准学会的意思):ANSI 是为了让计算机支持更多的语言,而在 ASCII 的基础上的一种扩展字符编码。在不同语言操作上,ANSI 都表示当前计算机默认的编码方式。如在简体 Windows 操作下,ANSI 编码代表 GBK 编码;在繁体中文操作下,ANSI 编码代表 Big5 编码;在日文 Windows 操作系统中,ANSI 编码代表 Shift_JIS 编码;在英文操作系统下,ANSI 就是 ASCII 编码。
.   5.  MBCS
MBCS(Multi-Byte Character Set),早在 1980 年,中国就提出了使用 GB2312 编码方式来描述汉字。后来其他东亚国家也利用这种方式扩展 ASCII 编码字符集。台湾地区 5 大
企业推出的繁体 Big5 码,香港新加坡等后来也利用。日本韩国也相应推出了自己的编码方式。其实在这里,BIG5 既是编码方式,也是字符集。
  6.  GB2312(Guo Biao  2312) )
用双字节表示汉字,但是为了完全兼容 ASCII。汉字区“高字节”范围为 0xB0-0xF7,汉字区“低字节”范围 0xA1-0xFE,占用的码位 72*94=6768 个。
.   7.  GBK(Guo Biao Kuozhan)
后来发现 GB2312 的字符依然不够用,尤其是像“镕”(朱镕基)字打不出来。然后决定汉字区的低字节完全不兼容 ASCII,只要当前字符属于汉字码,那么其后的字符也属于汉字码。这样在兼容 GB2312 的基础上,再添加了近两万字和字符(兼容繁体、日本汉字、韩国汉字等)。GBK 同样也是一种编码方式和字符集两种意义合于一体。
.   8.  GB18030
有两版 GB18030-2000 和 GB18030-2005,是 GBK 的扩展版,并且完全兼容 GBK。GB18030和 utf-8 类似,是动态的,既有单字节字体,也有双字节字节(BGK),也有三字节,四字节字符。Windows 默认支持的是 GBK,若要支持 GB18030,需要下载安装单独的支持包。
.  9.  Big5 5
1984 年台湾五家公司联合创立,称大五码,英文 Big5。Big5 也是双字节编码方式,收录了一万多字符,但是没有包含中文简体。Big5 目前也被香港、新家坡等地区国家使用。Big5 保存的文本,在简体操作系统下显示乱码,但是有些编辑器会自动识别,然后将其按 GBK 繁体字显示,即可正常显示。如 Notepad++即有此功能。
  10.  全角
GBK 用两个字节重新表示了一遍在 ASCII 中出现的字符,这些字符被叫全角字符。
  11.  半角
出现在 ASCII 中的字符,被称作半角字符。
  12. e Unicode  字符集
Unicode 字符集是 1990 年提出的,能够表示全世界所有国家的所有字符。但是支持Unicode 字符集的编码方式都有多种,如 UTF-8,UTF-16 等。编码方式虽然不同,但是
都是可以完整表示所有 Unicode 字符的。VS 里默认的 Unicode 字符集是指 utf-16 编码的,即固定双字节为一个字符。
  13.  UTF- -8 8
因为 Unicode 能够包含全球所有的字符,而 utf-8 又是其中比较节省字符存储的一种实现方式。所以现在的网站,基本都是以 utf-8 编码方式来存储、传输和显示了。UTF-8
是变字节长度的,用 1-6 个字节表示字符。用一个字符表示常见字符,用二个字节表示拉丁文、希腊文、西里尔字母、亚美尼亚语、希伯来文、阿拉伯文、叙利亚等,用三字
符表示常见汉字等,四个字节的字符比较少见。UTF-8 既能很方便存储英文,又能兼容全世界的字符,所以非常流行。
  14.  UTF- -8 8  解析算法
如果字节的第一位为 0,则 B 为 ASCII 码,并且 Byte 独立的表示一个字符;
如果字节的第一位为 1,第二位为 0,则 Byte 为一个非 ASCII 字符(该字符由多个字节表示)中的一个字节,并且不为字符的第一个字节编码;
如果字节的前两位为 1,第三位为 0,则 Byte 为一个非 ASCII 字符(该字符由多个字节
表示)中的第一个字节,并且该字符由两个字节表示;
如果字节的前三位为 1,第四位为 0,则 Byte 为一个非 ASCII 字符(该字符由多个字节表示)中的第一个字节,并且该字符由三个字节表示;
如果字节的前四位为 1,第五位为 0,则 Byte 为一个非 ASCII 字符(该字符由多个字节
表示)中的第一个字节,并且该字符由四个字节表示代码页(CodePag):代码页是字符集的数字值,不同的语言使用不同的代码页。例 如,ANSI
代码页为 1252,日文代码页为 932,简体中文(GBK)代码页为 936,繁体中文(Big5)代码页为 950。
  15.  语言包
系统默认的是 ANSI,但是同时也兼容 Unicode,这也是 Windows 的 API 有两套。当系统识别到当前字符是 Unicode 时,会以对应的 Unicode 编码方式去解码,Windows 支持的是 utf-8。解码之后,需要正确地显示出相应的字形,这个时候就需要语言包。如果没有语言包,会出现乱码。英文操作下,东亚语言归为一类,需要单独安装,安装时提示230MB。因为语言包比较大,所以在英文操作系统下,默认没有安装东亚语言包的,即不能正确显示 Unicode 下的东亚文字。至于语言包为什么这么大,猜测语言包必须得描述这个字体是如何点钩撇捺的等等。Windows 可以在控制面板中设置非 Unicode 程序显示语言。
  16.  大小端模式
由于 CPU 的缘故,存取数据分大端模式和小端模式,然后一些操作系统了软件也会有这样的区分。大端模式(Big-endian),是指数据的高字节,保存在内存的低地址中,而
数据的低字节,保存在内存的高地址中,这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加,而数据从高位往低位放。小端模式(Little-endian),
是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中,这种存储模式将地址的高低和数据位权有效地结合起来,高地址部分权值高,低地址部分
权值低,和我们的逻辑方法一致。
  17.  BOM(Byte Order Mark, 字节顺序标记) )
有一些文本编辑工具支持 UTF-8(BOM),字符 U+FEFF 如果出现在字节流的开头,则用来标识该字节流的字节序,是高位在前还是低位在前。接收者收到 FEFF,就表明这个字节
流是 Big-Endian 的;如果收到 FFFE,就表明这个字节流是 Little- Endian 的。Windows 文本默认的 Unicode 为大端 utf-16 存储,即以 FFFE 开头。BOM 主要应用Windows 下,而在某些系统下可能会出错,如 PHP 中容易读错。

编码  以此标记 (十六进制)  以此标记 (十进制)
UTF-8 EF BB BF 239 187 191
UTF-16(大端序) FE FF 254 255
UTF-16(小端序) FF FE 255 254
UTF-32(大端序) 00 00 FE FF 0 0 254 255
UTF-32(小端序) FF FE 00 00  255 254 0 0 

  18.  GBK 、e Unicode 他 他  UTF- -8 8  转换
UTF-8 和 GBK 同属于多字节 MultiByte,Unicode 默认是 UTF-16,即宽字符,两个字节。

GBK(ANSI)->Unicode->UTF-8,反向即 UTF-8->Unicode->GBK(ANSI)。

    1. // 注释:多字节包括GBK和UTF-8
    2. int GBK2UTF8(char *szGbk,char *szUtf8,int Len)
    3. {
    4. // 先将多字节GBK(CP_ACP或ANSI)转换成宽字符UTF-16
    5. // 得到转换后,所需要的内存字符数
    6. int n = MultiByteToWideChar(CP_ACP,0,szGbk,-1,NULL,0);
    7. // 字符数乘以 sizeof(WCHAR) 得到字节数
    8. WCHAR *str1 = new WCHAR[sizeof(WCHAR) * n];
    9. // 转换
    10. MultiByteToWideChar(CP_ACP,  // MultiByte的代码页Code Page
    11. 0,            //附加标志,与音标有关
    12. szGbk,        // 输入的GBK字符串
    13. -1,           // 输入字符串长度,-1表示由函数内部计算
    14. str1,         // 输出
    15. n             // 输出所需分配的内存
    16. );
    17. // 再将宽字符(UTF-16)转换多字节(UTF-8)
    18. n = WideCharToMultiByte(CP_UTF8, 0, str1, -1, NULL, 0, NULL, NULL);
    19. if (n > Len)
    20. {
    21. delete[]str1;
    22. return -1;
    23. }
    24. WideCharToMultiByte(CP_UTF8, 0, str1, -1, szUtf8, n, NULL, NULL);
    25. delete[]str1;
    26. str1 = NULL;
    27. return 0;
    28. }
    1. //UTF-8 GBK
    2. int UTF82GBK(char *szUtf8,char *szGbk,int Len)
    3. {
    4. int n = MultiByteToWideChar(CP_UTF8, 0, szUtf8, -1, NULL, 0);
    5. WCHAR * wszGBK = new WCHAR[sizeof(WCHAR) * n];
    6. memset(wszGBK, 0, sizeof(WCHAR) * n);
    7. MultiByteToWideChar(CP_UTF8, 0,szUtf8,-1, wszGBK, n);
    8. n = WideCharToMultiByte(CP_ACP, 0, wszGBK, -1, NULL, 0, NULL, NULL);
    9. if (n > Len)
    10. {
    11. delete[]wszGBK;
    12. return -1;
    13. }
    14. WideCharToMultiByte(CP_ACP,0, wszGBK, -1, szGbk, n, NULL, NULL);
    15. delete[]wszGBK;
    16. wszGBK = NULL;
    17. return 0;
    18. }

    19. 附ASCII码图表

Windows程序员必须知道的字符编码和字符集的更多相关文章

  1. windows程序员开发linux程序的头一个月

    开发环境选择 vim,vscode,qt,visual studio都可以做linux c++开发,但是作为windows程序员,最熟悉的还是visual stuio,加上visual studio ...

  2. windows程序员进阶系列:《软件调试》之堆 (一)

    windows程序员进阶系列:<软件调试>之堆 (一) 堆是软件在运行时动态申请内存空间的主要途径.从堆上申请来的空间需要程序员自己申请和释放,且申请和释放操作必须绝对匹配.忘记释放或者多 ...

  3. 做10年Windows程序员与做10年Linux程序员的区别

    如果一个程序员从来没有在linux,unix下开发过程序,一直在windows下面开发程序, 同样是工作10年, 大部分情况下与在linux,unix下面开发10年的程序员水平会差别很大.我写这篇文章 ...

  4. 做10年Windows程序员与做10年Linux程序员的区别(附无数评论)(开源软件相当于熟读唐诗三百首,不会作诗也会吟)

    如果一个程序员从来没有在linux,unix下开发过程序,一直在windows下面开发程序, 同样是工作10年, 大部分情况下与在linux,unix下面开发10年的程序员水平会差别很大.我写这篇文章 ...

  5. windows程序员进阶系列:《软件调试》之Win32堆的调试支持

    Win32堆的调试支持 为了帮助程序员及时发现堆中的问题,堆管理器提供了以下功能来辅助调试. 1:堆尾检查(Heap Tail Check) HTC,在堆尾添加额外的标记信息,用于检测堆块是否溢出. ...

  6. windows 程序员电脑设置

    程序员电脑设置: 1.详细目录 a.在一个文件夹下设为详细信息 b.win7点击"组织"-->"文件夹的搜索选项"-->"查看" ...

  7. Java之字符编码和字符集

    什么是字符编码 计算机中储存的信息都是用二进制数表示的,而我们在屏幕上看到的数字.英文.标点符号.汉字等字符是二进制数转换之后的结果.按照某种规则,将字符存储到计算机中,称为编码 .反之,将存储在计算 ...

  8. MySQL学习笔记之一---字符编码和字符集

    前言: 一般来说,出现中文乱码,都是客户端和服务端字符集不匹配导致的原因. (默认未指定字符集创建的数据库表,都是latinl字符集, 强烈建议使用utf8字符集)   保证不出现乱码的思想:保证客户 ...

  9. Python中文文件处理中涉及的字符编码及字符集

    在现在的互联网,字符编码是互联网信息交互的一个重要基础,各种语言都有支持信息编码的机制,Python也不例外.Python除了字符编码之外,对于字节码和字符串两种类型有严格区分,字符串是本地可以读取的 ...

随机推荐

  1. 关于div宽度和高度的100%设定

    设置DIV大小的有两个属性width和height,以前在学习DIV每次给DIV设置100%宽度或高度时都很迷惑,不明白这个100%的宽度(高度)到底有多宽有多高?这个100%是从哪里得到的从哪里继承 ...

  2. Java中的Runtime类

    Runtime类描述了虚拟机一些信息.该类采用了单例设计模式,可以通过静态方法 getRuntime()获取Runtime类实例.下面演示了获取虚拟机的内存信息: package Main; publ ...

  3. STM8时钟系统详解

    就我个人看来,研究一块单片机,分为新手和老手两种模式,新人迫切的想先用,你得告诉他们怎么样最快的写出一个能跑起来的程序,告诉他们每一个外设的使用方式,老手不同,用的单片机多了外设对于他们而言没太多好奇 ...

  4. 读【10问PHP程序员】 有感

    http://bbs.phpchina.com/thread-174331-1-1.html 看到前人的文章,总结自己的学习心得,颇有感悟,下面是自己的总结,平时就拿出来多问问自己.1.上了十几年的学 ...

  5. js原生写的微博留言板有angularjs效果

    1.HTML: <!DOCTYPE html><html><head lang="en">    <meta charset=" ...

  6. Angular - - $compile编译服务与指令

    $compile 这是个编译服务.编译一段HTML字符串或者DOM的模板, 产生一个将scope和模板连接到一起的函数. 编译服务主要是为指令编译DOM元素,下面的一大段也是主要介绍指令的. 下面是一 ...

  7. systemd-journal[825]: Forwarding to syslog missed 99 messages

    In this particular case we have a DNS server running Bind which is logging all DNS queries. 7124 mes ...

  8. webx学习

    webx框架学习指南 http://openwebx.org/docs/Webx3_Guide_Book.html webx学习(一)——初识webx webx学习(二)——Webx Framewor ...

  9. Eclipse 使用说明

    2. 使用技巧 2.1. Eclipse 打开文件所在文件夹 2.2. Mac 安装Eclipse 2.3. Eclipse 安装插件 2.4. Eclipse 工具栏不见了 2.5. Eclipse ...

  10. HDU-1102-Constructing Roads(并查集)

    题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1102 这题大意就不讲了, 这题很容易,不过我做的很不爽,一个下午,一直WA,后来才发现数组开小了 只开 ...