`
sunxboy
  • 浏览: 2821794 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

用例子详细介绍各种字符集编码转换问题(转)

阅读更多

本文背景:<o:p></o:p>

本人在编程时需要匹配字符串,由此想到了如果文件是各种字符编码的话,匹配结果有可能不正确,那么,如何判断不同的字符集?如何在不同字符集之间做转换?对于UNICODE编码逐渐通用的情况下,我们软件人员如何从容应对? 本文首先对常用字符集进行总结,然后在字符集的显示及转换上以实例介绍,最后总结了编程中遇到的编码问题。<o:p></o:p>

本文目的:<o:p></o:p>

对字符集编码做详细介绍,关键配以实例讲解,降低问题的复杂度。<o:p></o:p>

本文内容:<o:p></o:p>

1.    常用字符集分类<o:p></o:p>

1.1 简介<o:p></o:p>

·        ASCII及其扩展字符集<o:p></o:p>

作用:表语英语及西欧语言。<o:p></o:p>

位数:ASCII是用7位表示的,能表示128个字符;其扩展使用8位表示,表示256个字符。<o:p></o:p>

范围:ASCII007F,扩展从00FF<o:p></o:p>

<o:p> </o:p>

·        ISO-8859-1字符集<o:p></o:p>

作用:扩展ASCII,表示西欧、希腊语等。<o:p></o:p>

位数:8位,<o:p></o:p>

范围:00FF,兼容ASCII字符集。<o:p></o:p>

<o:p> </o:p>

·        GB2312字符集<o:p></o:p>

作用:国家简体中文字符集,兼容ASCII<o:p></o:p>

位数:使用2个字节表示,能表示7445个符号,包括6763个汉字,几乎覆盖所有高频率汉字。<o:p></o:p>

范围:高字节从A1F7, 低字节从A1FE。将高字节和低字节分别加上0XA0即可得到编码。<o:p></o:p>

<o:p> </o:p>

·        BIG5字符集<o:p></o:p>

作用:统一繁体字编码。<o:p></o:p>

位数:使用2个字节表示,表示13053个汉字。<o:p></o:p>

范围:高字节从A1F9,低字节从407EA1FE<o:p></o:p>

<o:p> </o:p>

·        GBK字符集<o:p></o:p>

作用:它是GB2312的扩展,加入对繁体字的支持,兼容GB2312<o:p></o:p>

位数:使用2个字节表示,可表示21886个字符。<o:p></o:p>

范围:高字节从81FE,低字节从40FE<o:p></o:p>

<o:p> </o:p>

·        GB18030字符集<o:p></o:p>

作用:它解决了中文、日文、朝鲜语等的编码,兼容GBK<o:p></o:p>

位数:它采用变字节表示(1 ASCII24字节)。可表示27484个文字。<o:p></o:p>

范围:1字节007F; 2字节高字节从81FE,低字节从407E80FE4字节第一三字节从81FE,第二四字节从3039<o:p></o:p>

<o:p> </o:p>

·        UCS字符集<o:p></o:p>

作用:国际标准 ISO 10646 定义了通用字符集 (Universal Character Set)。它是与UNICODE同类的组织,UCS-2UNICODE兼容。<o:p></o:p>

位数:它有UCS-2UCS-4两种格式,分别是2字节和4字节。<o:p></o:p>

范围:目前,UCS-4只是在UCS-2前面加了0x0000<o:p></o:p>

<o:p> </o:p>

·        UNICODE字符集<o:p></o:p>

作用:为世界650种语言进行统一编码,兼容ISO-8859-1<o:p></o:p>

位数:UNICODE字符集有多个编码方式,分别是UTF-8UTF-16UTF-32<o:p></o:p>

UTF-8采用变长字节 (1 ASCII, 2 希腊字母, 3 汉字, 4 平面符号) 表示,网络传输, 即使错了一个字节,不影响其他字节,而双字节只要一个错了,其他也错了,具体如下:<o:p></o:p>

如果只有一个字节则其最高二进制位为0;如果是多字节,其第一个字节从最高位开始,连续的二进制位值为1的个数决定了其编码的字节数,其余各字节均以10开头。UTF-8最多可用到6个字节。<o:p></o:p>

<o:p> </o:p>

UTF-16采用2字节,Unicode中不同部分的字符都同样基于现有的标准。这是为了便于转换。从 0x00000x007FASCII字符,从0x00800x00FFISO-8859-1ASCII的扩展。希腊字母表使用从0x03700x03FF 的代码,斯拉夫语使用从0x04000x04FF的代码,美国使用从0x05300x058F的代码,希伯来语使用从0x05900x05FF的代 码。中国、日本和韩国的象形文字(总称为CJK)占用了从0x30000x9FFF的代码;<o:p></o:p>

由于0x00c语言及操作系统文件名等中有特殊意义,故很多情况下需要UTF-8编码保存文本,去掉这个0x00。举例如下:<o:p></o:p>

UTF-16: 0x0080  = 0000 0000 1000 0000<o:p></o:p>

UTF-8:   0xC280 = 1100 0010 1000 0000<o:p></o:p>

UTF-32:采用4字节。<o:p></o:p>

优缺点:<o:p></o:p>

·        UTF-8UTF-16UTF-32都可以表示有效编码空间 (U+000000-U+10FFFF) 内的所有Unicode字符。<o:p></o:p>

·        使用UTF-8编码时ASCII字符只占1个字节,存储效率比较高,适用于拉丁字符较多的场合以节省空间。<o:p></o:p>

·        对于大多数非拉丁字符(如中文和日文)来说,UTF-16所需存储空间最小,每个字符只占2个字节。<o:p></o:p>

·        Windows NT内核是UnicodeUTF-16),采用UTF-16编码在调用系统API时无需转换,处理速度也比较快。<o:p></o:p>

·        采用UTF-16UTF-32会有Big EndianLittle Endian之分,而UTF-8则没有字节顺序问题,所以UTF-8适合传输和通信。<o:p></o:p>

·        UTF-32采用4字节编码,一方面处理速度比较快,但另一方面也浪费了大量空间,影响传输速度,因而很少使用。<o:p></o:p>

<o:p> </o:p>

1.2 按所表示的文字分类<o:p></o:p>

  

语言
字符集
正式名称
英语、西欧语
ASCIIISO-8859-1
MBCS 多字节
简体中文
GB2312
MBCS 多字节
繁体中文
BIG5
MBCS 多字节
简繁中文
GBK
MBCS 多字节
中文、日文及朝鲜语
GB18030
MBCS 多字节
各国语言
UNICODEUCS
DBCS 宽字节

 

 

 

 

 

 

2.  如何判断字符集<o:p></o:p>

2.1 字节序<o:p></o:p>

首先说一下字节序对编码的影响,字节序分为Big Endian字节序和Little Endian字节序。不同的处理器可能不一样。所以,传输时需要告诉处理器当时的编码字节序。对于前者而言,高位字节存在低地址,低字节存于高地址;后者相反。例如,0X03AB, <o:p></o:p>

Big Endian字节序是<o:p></o:p>

0000: 0 3<o:p></o:p>

0001: AB<o:p></o:p>

Little Endian字节序是<o:p></o:p>

0000: AB<o:p></o:p>

0001: 0 3<o:p></o:p>

<o:p> </o:p>

2.2 编码识别<o:p></o:p>

·        UNICODE<o:p></o:p>

根据前几个字节可以判断UNICODE字符集的各种编码,叫做Byte Order Mask方法BOM<o:p></o:p>

UTF-8: EFBBBF (符合UTF-8格式,请看上面。但没有含义在UCSUNICODE)<o:p></o:p>

UTF-16 Big EndianFEFF (没有含义在UCS-2)<o:p></o:p>

UTF-16 Little EndianFFFE (没有含义在UCS-2)<o:p></o:p>

UTF-32 Big Endian0000FEFF (没有含义在UCS-4)<o:p></o:p>

UTF-32 Little EndianFFFE0000 (没有含义在UCS-4)<o:p></o:p>

·        GB2312<o:p></o:p>

      高字节和低字节的第1位都是1<o:p></o:p>

·        BIG5GBK&GB18030<o:p></o:p>

高字节的第1位为1。操作系统有默认的编码,常为GBK,可以下载别的并升级。通过判断高字节的第1位从而知道是ASCII或者汉字编码。<o:p></o:p>

<o:p> </o:p>

3.      编程:各字符集编码的读取<o:p></o:p>

注意,下面的例子都会用到这个文件,读取这个文件。在Encodeing 选项中可以选择ASCII编码、UTF-8UNICODE Big EndianUNICODE Little Endi

分享到:
评论

相关推荐

    vb.net编码解码例子form字符集转换

    vb.ne所有编码之间的互相转换,字符集转换,编码解码例子form

    PB9转换utf-8例子

    PB9及以下版本没有直接转换字符编码的函数或方法,本例子使用ADODB.Stream进行转换。

    PHP通过iconv将字符串从GBK转换为UTF8字符集

    1. iconv()介绍 iconv函数可以将一种已知的字符集文件转换成另一种已知的字符集文件。例如:从GB2312转换为UTF-8。 iconv函数在php5中内置,GB字符集默认打开。 2. iconv()错误 iconv在转换字符”—”到gb2312时会...

    vb.net编码解码例子form

    vb.net编码解码例子form,字符集转换

    RFC1428_Internet邮件从Just-Send-8到8bit-SMTPMIME的转换 .doc

    只要这些补充说明能够不通过中级转换而进行通信,并有在不拖延地使用专用字符集时有一个放宽的秘密协议,那么基本的邮件服务就能够被提供。 在转换为已定的8bitESMTP/MIME环境中,一个当前没有遵循协议的用户所发送...

    Encoding

    负责进行字符编码转换,返回转换后的字符串 使用前,请将var $FilePath=\"\"变量该为该程序文件的绝对路径,否则将会找不到数据文件 例子: 将gbk编码的字符串转化为UTF-8编码: $s=\"GBK编码\"; $...

    深入Mysql字符集设置 图文版

    在mysql客户端与mysql服务端之间,存在着一个字符集转换器。 character_set_client =&gt;gbk:转换器就知道客户端发送过来的是gbk格式的编码 character_set_connection=&gt;gbk:将客户端传送过来的数据转换成gbk格式 ...

    python中的代码编码格式转换问题

    刚来这个公司,熟悉了环境,老大就开始让我做一个迁移、修改代码的工作,... 先说说为什么会有编码问题,就拿上面那个例子来说,B机房这边数据库全是GBK编码的,因此从数据库中取出来的数据都是GBK的,从数据库中取出

    Mysql数据库编码问题 (修改数据库,表,字段编码为utf8)

    因为utf8字符集是目前最适合于实现多种不同字符集之间的转换的字符集,尽管你在命令行工具上可能无法正确查看数据库中的内容,我依然强烈建议使用utf8作为默认字符集接下来是完整的一个例子: 1.创建数据库表 mysql&gt;...

    Python3 chardet模块查看编码格式的例子

    需要注意的是,如果遇到GBK2312等编码的,在decode和encode时,一律使用GBK进行编码或者解码,这是因为GBK是其他GBK编码的超集,向下兼容所有的GBK编码。 下面是一个例子: #coding...

    Arabic-OCR:用于阿拉伯语的OCR系统,可将键入文本的图像转换为机器编码的文本

    该系统旨在解决仅包含阿拉伯字符的图像的OCR问题(请检查下面的数据集链接以查看图像样本)。 设置 安装python然后运行以下命令: pip install -r requirements.txt 跑步 将图像放在src / test目录中 转到src目录...

    Golang GBK转UTF-8的例子

    原因:Golang 默认不支持 UTF-8 以外的字符集 解决:将字符串的编码转换成UTF-8 首先需要 mahonia 这个包 go get github.com/axgle/mahonia 然后新建一个 func src 字符串 srcCode 字符串当前编码 tagCode 要转换的...

    VC++6.0核心编程源码.rar

    当然,你首先必须自己转换字符串,然后将已转换的消息表资源嵌入你的.exe文件或DLL模块,不过,这时该函数会选定正确的嵌入对象。ErrorShow示例应用程序(本章后面将加以介绍)展示了如何调用该函数,以便将...

    oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 连接字符串

    选择安装路径,选择数据库版本(企业版),选择字符集(默认值) 填写全局数据库名,管理口令 6. 步骤5/8:先决条件检查 如果你的电脑满足要求但仍然显示检查失败,这时候直接忽略,勾选全部忽略 7. 步骤6/8:概要信息...

    mysql官方中文参考手册

    5.10.1. 数据和排序用字符集 5.10.2. 设置错误消息语言 5.10.3. 添加新的字符集 5.10.4. 字符定义数组 5.10.5. 字符串比较支持 5.10.6. 多字节字符支持 5.10.7. 字符集问题 5.10.8. MySQL服务器时区支持 5.11. MySQL...

    MYSQL中文手册

    5.10.1. 数据和排序用字符集 5.10.2. 设置错误消息语言 5.10.3. 添加新的字符集 5.10.4. 字符定义数组 5.10.5. 字符串比较支持 5.10.6. 多字节字符支持 5.10.7. 字符集问题 5.10.8. MySQL服务器时区支持 ...

    MySQL 5.1参考手册中文版

    5.10.1. 数据和排序用字符集 5.10.2. 设置错误消息语言 5.10.3. 添加新的字符集 5.10.4. 字符定义数组 5.10.5. 字符串比较支持 5.10.6. 多字节字符支持 5.10.7. 字符集问题 5.10.8. MySQL服务器时区支持 5.11...

    MySQL 5.1参考手册

    5.10.1. 数据和排序用字符集 5.10.2. 设置错误消息语言 5.10.3. 添加新的字符集 5.10.4. 字符定义数组 5.10.5. 字符串比较支持 5.10.6. 多字节字符支持 5.10.7. 字符集问题 5.10.8. MySQL服务器时区支持 5.11. MySQL...

    C语言FAQ 常见问题列表

    C 语言常见问题集 原著:Steve Summit 翻译:朱群英, 孙 云 修订版 0.9.4, 2005年6月23日 版权所有 © 2005 * 目录 * 1. 前言 * 2. 声明和初始化 o 2.1 我如何决定使用那种整数类型? o 2.2 64 位机上的 ...

Global site tag (gtag.js) - Google Analytics