字符编码转换问题

字符编码转换问题
字符编码转换问题

字符编码转换

常用编码方式UTF-8,ISO-8859-1(单字节),GBK

1.编码

String类的getBytes(String charset)//根据指定的编码方式编码,并返回该字符串在该编码下的字节数组。如果使用getBytes()不声明编码方式则使用下操作系统默认的编码方式。

2.解码

String类的构造方法,String(byte[] b,String charset)//根据指定的编码方式进行解码,即将字节数组还原成字符串。此方法返回一个字符串。

3.过程

字符串先编译成unicode形式,再转换成UTF-8/GBK的字符串,再将字符串的字节二进制取反码存储,显示在控制台的是反码的十进制表示。如中文的“丁”,转换成unicode为4E 01两个字节,然后将其转化为二进制0100111100000001,分析可知需要3个字节才能转换,所以将二进制数按从低到高依次填入格式0800-FFFF格式中,高位不够用0填充。转换后得到E4 B8 81三个字节,取他们的补码再转换成十进制的符号数,组成UTF-8字节数组-28 -72 -127保存。

4.英文字符串编码和解码

举例:将字符串用三种方式编码

将每种编码获得的每个字节输出:

从结果可以看出,对于英文字符串,三种编码方式所得的字节

数组内容相同。所以可以在解码时,三种方式可以通用,但最

好编码的方式和解码的方式一致。如

结果都能成功解码,而不出现乱码

5.中文字符串编码与解码

将中文字符串编码后的字节输出

可见在不同的编码方式下,中文字符的字节数组表示不同,

UTF-8用三个字节表示一个汉字,GBK用两个字节表示。因为

ISO-8859-1不能识别中文,所以会用英文的”?”来代替中文,然后将“??”进行编码,所以一个中文用一个字节63表示。

注意:标点符号是全角还是半角。

(1)UTF-8解码:

结果只有UTF-8可以解码,其他都是乱码。

(2)ISO-8859-1解码

结果都不能解码,都是乱码。因为ISO-8859-1编码不能正常识别,所以用”?”来代替中文,所以编译的是“?”,所以三种编码方式都可以解码,得到“???”

(3)GBK解码

结果只有GBK可以解码

(4)总结

从以上结果可以看出,中文字符的编码和解码的方式必须一致才能正常解码。且ISO-8859-1编码方式用相同的方式解码依然是乱码,不能正常解码。原因是因为ISO8859-1编码的编码不包含汉字字符,所以无法使用getByte()来进行编码,更别提解码了。

6.编码方式的使用

(1)在对内容进行编码时,一定要选择合适的编码方式。只含英文的

可以使用ISO-8859-1

(2)含中英文可以使用UTF-8/GBK;GBK包含全部中文字符;UTF-8

则包含全世界所有国家需要用到的字符。

7.网络传输中的编码转换

(1)选择合适的编码方式后:

UTF-8编码后的字节数组可以使用GBK和ISO-8859-1进行解码进行传输,到达目的地后再使用GBK和ISO-8859-1进行编码取原字节数组后,使用UTF进行解码就可以在目的地得到中文字符了。

gbk编码后只能用iso8859-1解码后编回去

(2)举例:

结果

(3)总结:虽然ISO-8859-1不能正常编译中文,但可以将字节数组解码成一个字节数不变(如上9个字节)的String存储起来,再通过自身的编码,将该String编码成原本的字节数组。

就好比字节数组为name和scode的过度阶段,冰(name)变成水(字节数组),然后变成雾(ISO),雾传播到了别的地方,又变成了水,水又结成冰。

字符编码的转换

C++字符串完全指南- Win32字符编码(一) 前言 字符串的表现形式各异,象TCHAR,std::string,BSTR等等,有时还会见到怪怪的用_tcs起头的宏。这个指南的目的就是说明各种字符串类型及其用途,并说明如何在必要时进行类型的相互转换。 在指南的第一部分,介绍三种字符编码格式。理解编码的工作原理是致为重要的。即使你已经知道字符串是一个字符的数组这样的概念,也请阅读本文,它会让你明白各种字符串类之间的关系。 指南的第二部分,将阐述各个字符串类,什么时候使用哪种字符串类,及其相互转换。 字符串基础 - ASCII, DBCS, Unicode 所有的字符串类都起源于C语言的字符串,而C语言字符串则是字符的数组。首先了解一下字符类型。有三种编码方式和三种字符类型。 第一种编码方式是单字节字符集,称之为SBCS,它的所有字符都只有一个字节的长度。ASCII码就是SBCS。SBCS字符串由一个零字节结尾。 第二种编码方式是多字节字符集,称之为MBCS,它包含的字符中有单字节长的字符,也有多字节长的字符。Windows用到的MBCS只有二种字符类型,单字节字符和双字节字符。因此Windows中用得最多的字符是双字节字符集,即DBCS,通常用它来代替MBCS。 在DBCS编码中,用一些保留值来指明该字符属于双字节字符。例如,Shift-JIS(通用日语)编码中,值 0x81-0x9F 和 0xE0-0xFC 的意思是:“这是一个双字节字符,下一个字节是这个字符的一部分”。这样的值通常称为前导字节(lead byte),总是大于0x7F。前导字节后面是跟随字节(trail byte)。DBCS的跟随字节可以是任何非零值。与SBCS一样,DBCS字符串也由一个零字节结尾。 第三种编码方式是Unicode。Unicode编码标准中的所有字符都是双字节长。有时也将Unicode称为宽字符集(wide characters),因为它的字符比单字节字符更宽(使用更多内存)。注意,Unicode不是MBCS - 区别在于MBCS编码中的字符长度是不同的。Unicode字符串用二个零字节字符结尾(一个宽字符的零值编码)。

单片机实验二进制ASCII码转换

实验三二进制ASCII码转换 一、实验目的 1.了解BCD值和ASCII值的区别 2.掌握用查表的方法将BCD值转换成ASCII值 二、实验说明 此实验主要让学生了解数值的BCD码和ASCII码的区别,利用查表方法可以快速地进行数值转换。进一步掌握数值的各种表达方式。现在我们给出一个BCD数,将其转换成ASCII 值。如下:将累加器A的值拆为二个ASCII码,并存入Result开始的二个单元,例程A赋值#1AH。 三、实验内容及步骤 1.安装好仿真器,用串行数据通信线连接计算机与仿真器,把仿真头插到模块的单片机插座中,打开模块电源,插上仿真器电源插头(USB线)。 2.启动PC机,打开KEIL软件,软件设置为模拟调试状态。在所建的Project文件中添加TH 3.ASM源程序进行编译,编译无误后,全速运行程序,打开数据窗口(DATA)(在MEMORY#1中输入D:30H 回车),点击暂停按钮,观察地址30H、31H的数据变化,30H更新为31,31H 更新为41。用键盘输入改变地址30H、31H的值,点击复位按钮后,可再次运行程序,观察其实验效果。修改源程序中给累加器A的赋值,重复实验,观察实验效果。 3.打开CPU窗口,选择单步或跟踪执行方式运行程序,观察CPU窗口各寄存器的变化,可以看到程序执行的过程,加深对实验的了解。 四、流程图及源程序(见光盘中的程序文件夹) 1.源程序 RESULT EQU 30H ORG 0 LJMP START ASCIITAB: DB ‘0123456789ABCDEF' ;定义数字对应的ASCII表 BINTOHEX: MOV DPTR,#ASCIITAB MOV B, A ;暂存A SWAP A ANL A,#0FH ;取高四位 MOVC A,@A+DPTR ;查ASCII表 MOV RESULT, A MOV A,B ;恢复A ANL A,#0FH ;取低四位 MOVC A,@A+DPTR ;查ASCII表 MOV RESULT+1,A RET START: MOV SP,#40H

常用字符集介绍和编码转换原理

常用字符集介绍和编码转换原理 目录 1. GB2312编码介绍 (2) 1.1 基本信息 (2) 1.2 GB标准 (2) 1.3 分区表示 (2) 1.4 字节结构 (2) 2. 通用字符集UCS (3) 2.1 定义 (3) 2.2 概要 (3) 2.3 实现级别 (3) 2.4 与UNICODE的兼容关系 (3) 3. unicode编码介绍 (3) 3.1 基本简介 (4) 3.2 编码实现 (4) 3.2.1 编码方式 (4) 3.2.2 实现方式 (5) 4. UTF-8介绍 (5) 4.1 基本介绍 (5) 4.2 编码原理 (5) 4. 转换原理 (7)

1. GB2312编码介绍 1.1 基本信息 1.2 GB标准 GB2312或GB2312-80是一个简体中文字符集的中国国家标准,全称为《信息交换用汉字编码字符集·基本集》,又称为GB0,由中国国家标准总局发布,1981年5月1日实施。GB2312编码通行于中国大陆;新加坡等地也采用此编码。中国大陆几乎所有的中文系统和国际化的软件都支持GB2312。 GB2312标准共收录6763个汉字,其中一级汉字3755个,二级汉字3008个;同时,GB2312收录了包括拉丁字母、希腊字母、日文平假名及片假名字母、俄语西里尔字母在内的682个全角字符。 GB2312的出现,基本满足了汉字的计算机处理需要,它所收录的汉字已经覆盖中国大陆99.75%的使用频率。 对于人名、古汉语等方面出现的罕用字,GB2312不能处理,这导致了后来GBK及GB18030汉字字符集的出现。 1.3 分区表示 GB 2312中对所收汉字进行了―分区‖处理,每区含有94个汉字/符号。这种表示方式也称为区位码。 01-09区为特殊符号。 16-55区为一级汉字,按拼音排序。 56-87区为二级汉字,按部首/笔画排序。 10-15区及88-94区则未有编码。 举例来说,―啊‖字是GB2312之中的第一个汉字,它的区位码就是1601。 1.4 字节结构

Unicode、UTF-8与GB2312等编码之间是如何转换的

字符编码知识:Unicode、UTF-8、ASCII、GB2312等编码之间是如何转换的?(... 字符编码是计算机技术的基石,想要熟练使用计算机,就必须懂得字符编码的知识。不注意的人可能对这个不在意,但这些名词有时候实在让人迷惑,对想学习计算机知识的人来说,搞懂它也十分重要,我也是在学习中慢慢了解了一些这方面的知识。 1. ASCII码 在计算机内部,所有的信息最终都表示为一个二进制的字符串。每一个二进制位(bit)有0和1两种状态,因此八个二进制位就可以组合出256种状态,这被称为一个字节(byte)。也就是说,一个字节一共可以用来表示256种不同的状态,每一个状态对应一个符号,就是256个符号,从0000000到11111111。 上个世纪60年代,美国制定了一套字符编码,对英语字符与二进制位之间的关系,做了统一规定。这被称为ASCII码,一直沿用至今。 ASCII码一共规定了128个字符的编码,比如空格“SPACE”是32(十进制的32,用二进制表示就是00100000),大写的字母A是65(二进制01000001)。这128个符号(包括32个不能打印出来的控制符号),只占用了一个字节的后面7位,最前面的1位统一规定为0。下面是截图:具体的可以到这个网页上去查下: 2、非ASCII编码 英语用128个符号编码就够了,但是用来表示其他语言,128个符号是不够的。比如,在法语中,字母上方有注音符号,它就无法用ASCII码表示。于是,一些欧洲国家就决定,利用字节中闲置的最高位编入新的符号。比如,法语中的é的编码为130(二进制10000010)。这样一来,这些欧洲国家使用的编码体系,可以表示最多256个符号。 但是,这里又出现了新的问题。不同的国家有不同的字母,因此,哪怕它们都使用256个符号的编码方式,代表的字母却不一样。比如,130在法语编码中代表了é,在希伯来语编码中却代表

C++编译器对字符串的编码转换

C++编译器对字符串的编码转换 殷海峰 2012年07月20日

变更记录 日期作者说明2012.07.18 殷海峰完成初稿 2012.07.20 殷海峰增加了如下内容 1、研究方法; 2、MinGW gcc 处理 Unicode 字符串; 3、VC++6.0处理rc文件里的字符串; 4、VC++.NET对字符串的处理 I

目录 第1章说明 (3) 1.1 前言 (3) 1.2 MinGW gcc (3) 1.2.1 ANSI字符串 (3) 1.2.2 Unicode字符串 (4) 1.2.3 #include (4) 1.3 VC++6.0 (4) 1.3.1 ANSI字符串 (5) 1.3.2 Unicode字符串 (5) 1.3.3 资源文件 (5) 1.4 VC++.NET (5) II

第1章说明 1.1 前言 本文将研究C++编译器对字符串的编码转换。如下面两行代码包含了一个ANSI字符串和一个Unicode字符串(也叫Wide字符串)。编译之后,它们具体的编码是什么? const char* pA = "123456789测试"; //ANSI字符串 const wchar_t* pW = L"123456789测试"; //Unicode字符串 使用UltraEdit以二进制打开编译生成的exe文件。找到123456789之后就可以查看ANSI字符串中“测试”的编码;找到16进制字符串 31 00 32 00 33 00 34 00 35 00就可以查看Unicode字符串中“测试”的编码。使用这个方法,本文对 MinGW gcc 和 VC++ 编译器进行了研究。 1.2 MinGW gcc 在 Windows 系统下,安装Qt Creator 2.3.1 之后,MinGW 4.4.0就被自动安装,其安装目录一般位于:C:\Qt\qtcreator-2.3.1\mingw。 1.2.1 ANSI字符串 MinGW gcc 4.4.0编译器对ANSI字符串的编码原则:保持其在源文件里的原始编码,不做任何转换。 举例说明:对于Test.cpp里的字符串"测试"。如果Test.cpp的编码是ANSI 的,则"测试"就是ANSI编码;如果Test.cpp的编码是UTF-8的,则"测试"就是UTF-8编码。编译器生成exe的时候,仅仅在它们后面增加一个字符'\0'。也就是说同样的字符串"测试",会因为Test.cpp的编码不同而不同。同样的代码s trlen("测试"),会因为Test.cpp的编码不同而返回不同的值。 了解了这个原理,下面来看两行QT代码: 3

符号与ASCII码的转换

实验一符号与ASCII码的转换 一、实验目的: 1、熟悉英文字母和常用符号的基本编码理论。 2、了解数字符号和数字ASCII码值的区别。 3、使用高级语言实现符号与ASCII码的转换。 二、实验要求: 1、界面友好、简洁 2、变量和函数要有注释 3、实验报告中要有程序流程图 三、实验环境: 1、硬件环境:主流配置计算机 2、操作系统:Windows xp (替换成实际应用系统) 3、编译平台:Visual C++ 6.0 (替换成实际应用平台) (可选语言包括C、C++、Java等等) 四、实验内容: 1、介绍一下ASCII编码(查找整理资料) –编写ASCII码转换程序(用流程图表示)

2、输入符号,打印出对应的ASCII码表(十进制、16进制、二进制) 3、输入ASCII码值(十进制、或16进制、或二进制), 打印出对应的符号。 4、创建一个文件(内容为一段英文),读入文件并将 其中的符号转换为ASCII码,写入另一个文件。 –调试并通过该程序(抓图示例,实验体会) 五、实验报告内容: 1、实验名称 2、实验目的 3、实验要求 4、实验环境 5、实验内容(算法描述、算法流程) 6、实验体会 六、实验报告正文: 1、ASCII编码的介绍 ASCII(American Standard Code for Information Interchange,美国信息交换标准代码)是基于拉丁字母的一套电脑编码系统。它主要用于显示现代英语,而其扩展版本EASCII则可以部分支持其他西欧语言,并等同于国际标准ISO/IEC 646。由于万维网使得ASCII广为通用,直到2007年12月,逐渐被Unicode取代。 ASCII码使用指定的7位或8位二进制数组合来表示128或256种可能的字符。标准ASCII码也叫基础ASCII码,使用7位二进制数来表示所有的大写和小写字母,数字0 到9、标点符号,以及在美式英语中使用的特殊控制字符。其中:

各种字符编码间的转换方法:MultiByteToWideChar和MultiByteToWideChar

MultiByteToWideChar和MultiByteToWideChar对各种字符编码间的转换 函数原型: int WideCharToMultiByte( UINT CodePage, DWORD dwFlags, LPCWSTR lpWideCharStr, int cchWideChar, LPSTR lpMultiByteStr, int cbMultiByte, LPCSTR lpDefaultChar, LPBOOL lpUsedDefaultChar ); 此函数把宽字符串转换成指定的新的字符串,如ANSI,UTF8等,新字符串不必是多字节字符集。参数: CodePage:指定要转换成的字符集代码页,它可以是任何已经安装的或系统自带的字符集,你也可以使用如下所示代码页之一。 参数说明: 1、CodePage——指定要转换成的字符集代码页,它可以是任何已经安装的或系统自带的字符集,可选择以下代码页: CP_ACP //当前系统ANSI代码页 CP_MACCP //当前系统Macintosh代码页 CP_OEMCP //当前系统OEM代码页,一种原始设备制造商硬件扫描码CP_SYMBOL //Symbol代码页,用于Windows 2000及以后版本 CP_THREAD_ACP //当前线程ANSI代码页,用于Windows 2000及以后版本 CP_UTF7 //UTF-7,设置此值时lpDefaultChar和lpUsedDefaultChar都必须为NULL CP_UTF8 //UTF-8,设置此值时lpDefaultChar和lpUsedDefaultChar都必须为NULL 用GetLocaleInfo 函数获取当前系统的代码页,936: 简体中文, 950: 繁

jquery字符编码转换

Ajax遭遇GBK编码(完全解决方案)占个座位先 国内互联网普遍都是使用GBK编码。对于J2EE项目,为了减少编码的干扰通常都是设置一个编码的Filter,强制将Request/Response编码改为GBK。例如一个Spring的常见配置如下: encodingFilter org.springframework.web.filter.CharacterEncodingFil ter encoding GBK forceEncoding true 毫无疑问,这在GBK编码的页面访问、提交数据时是没有乱码问题的。但是遇到Ajax就不一样了。Ajax强制将中文内容进行UTF-8编码,这样导致进入后端后使用GBK进行解码时发生乱码。 如果提交数据的时候能够告诉后端传输的编码信息是否就可以避免这种问题?比如Ajax请求告诉后端是UTF-8,其它请求告诉后端是GBK,这样后端分别根据指定的编码进行解码是不是就解决问题了。 问题: 1.如何通过Ajax告诉后端的编码?Header过于复杂,Cookie成本太高,使 用参数最方便。 2.后端何时进行解码?每一个请求进行解码,过于繁琐;获取参数时解码, 此时已经乱码;在Filter里面动态设置编码是最完善的方案。 3.如何从参数中获取编码?如果是POST的body显然无法获取,因此在获取 之前所有参数就已经按照某种编码解码过了,无法还原。所以通过URL 传递编码最有效。支持GET/POST,同时成本很低。 解决了上述问题,来看具体实现方案。列一段Java代码: import java.io.IOException; import java.util.regex.Matcher; import java.util.regex.Pattern;

ASCII码转16进制对照表

ASCII与16进制转换 ASCII16进制ASCII16进制ASCII16进制ASCII16进制NUL00H DLE10H SP20H030H SOH01H DC111H!21H131H STX02H DC212H"22H232H ETX03H DC313H#23H333H EOT04H DC414H$24H434H ENQ05H NAK15H%25H535H ACK06H SYN16H&26H636H BEL07H ETB17H'27H737H BS08H CAN18H(28H838H HT09H EM19H)29H939H LF0AH SUB1AH*2AH:3AH VT0BH ESC1BH+2BH;3BH FF0CH FS1CH,2CH<3CH CR0DH GS1DH_2DH=3DH SO0EH RS1EH.2EH>3EH SI0FH US1FH/2FH?3FH ASCII16进制ASCII16进制ASCII16进制ASCII16进制@40H P50H、60H p70H A41H Q51H a61H q71H B42H R52H b62H r72H C43H S53H c63H s73H D44H T54H d64H t74H E45H U55H e65H u75H F46H V56H f66H v76H G47H W57H g67H w77H H48H X58H h68H x78H

I49H Y59H i69H y79H J4AH Z5AH j6AH z7AH K4BH[5BH k6BH{7BH L4CH\5CH l6CHㄧ7CH M4DH]5DH m6DH}7DH N4EH↑5EH n6EH~7EH O4FH←5FH o6FH DEL7FH

UTF8与GBK字符编码之间的相互转换

UTF8与GBK字符编码之间的相互转换 C++ UTF8编码转换CChineseCode 一预备知识 1,字符:字符是抽象的最小文本单位。它没有固定的形状(可能是一个字形),而且没有值。“A”是一个字符,“€”(德国、法国和许多其他欧洲国家通用货币的标志)也是一个字符。“中”“国”这是两个汉字字符。字符仅仅代表一个符号,没有任何实际值的意义。 2,字符集:字符集是字符的集合。例如,汉字字符是中国人最先发明的字符,在中文、日文、韩文和越南文的书写中使用。这也说明了字符和字符集之间的关系,字符组成字符集(iso8859-1,GB2312/GBK,unicode)。 3,代码点:字符集中的每个字符都被分配到一个“代码点”。每个代码点都有一个特定的唯一数值,称为标值。该标量值通常用十六进制表示。 4,代码单元:在每种编码形式中,代码点被映射到一个或多个代码单元。“代码单元”是各个编码方式中的单个单元。代码单元的大小等效于特定编码方式的位数:UTF-8 :UTF-8 中的代码单元由8 位组成;在UTF-8 中,因为代码单元较小的缘故,每个代码点常常被映射到多个代码单元。代码点将被映射到一个、两个、三个或四个代码单元;UTF-16 :UTF-16 中的代码单元由16 位组成;UTF-16 的代码单元大小是8 位代码单元的两倍。所以,标量值小于 U+10000 的代码点被编码到单个代码单元中;UTF-32:UTF-32 中的代码单元由32 位组成;UTF-32 中使用的32 位代码单元足够大,每个代码点都可编码为单个代码单元;GB18030:GB18030 中的代码单元由8 位组成;在GB18030 中,因为代码单元较小的缘故,每个代码点常常被映射到多个代码单元。代码点将被映射到一个、两个或四个代码单元。 5,举例:“中国北京香蕉是个大笨蛋”这是我定义的aka字符集; 各字符对应代码点为: 北00000001 京00000010 香10000001 蕉10000010 是10000100 个10001000 大10010000 笨10100000 蛋11000000 中00000100 国00001000 下面是我定义的zixia 编码方案(8位),可以看到它的编码中表示了aka字符集的所有字符对应的代码单元; 北10000001 京10000010 香00000001 蕉00000010 是00000100 个00001000 大00010000 笨00100000 蛋01000000 中10000100 国10001000 所谓文本文件就是我们按一定编码方式将二进制数据表示为对应的文本如00000001000000100000010000001000000100000010000001000000这样的文件。我用一个支持zixia编码和aka字符集的记事本打开,它就按照编码方案显示为“香蕉是个大笨蛋” 如果我把这些字符按照GBK另存一个文件,那么则肯定不是这个,而是1100111111100011

字符编码之间的相互转换 UTF8与GBK

字符编码之间的相互转换UTF8与GBK C++ UTF8编码转换CChineseCode 一预备知识 1,字符:字符是抽象的最小文本单位。它没有固定的形状(可能是一个字形),而且没有值。“A”是一个字符,“€”(德国、法国和许多其他欧洲国家通用货币的标志)也是一个字符。“中”“国”这是两个汉字字符。字符仅仅代表一个符号,没有任何实际值的意义。 2,字符集:字符集是字符的集合。例如,汉字字符是中国人最先发明的字符,在中文、日文、韩文和越南文的书写中使用。这也说明了字符和字符集之间的关系,字符组成字符集(iso8859-1,GB2312/GBK,unicode)。 3,代码点:字符集中的每个字符都被分配到一个“代码点”。每个代码点都有一个特定的唯一数值,称为标值。该标量值通常用十六进制表示。 4,代码单元:在每种编码形式中,代码点被映射到一个或多个代码单元。“代码单元”是各个编码方式中的单个单元。代码单元的大小等效于特定编码方式的位数:UTF-8 :UTF-8 中的代码单元由8 位组成;在UTF-8 中,因为代码单元较小的缘故,每个代码点常常被映射到多个代码单元。代码点将被映射到一个、两个、三个或四个代码单元;UTF-16 :UTF-16 中的代码单元由16 位组成;UTF-16 的代码单元大小是8 位代码单元的两倍。所以,标量值小于U+10000 的代码点被编码到单个代码单元中;UTF-32:UTF-32 中的代码单元由32 位组成;UTF-32 中使用的32 位代码单元足够大,每个代码点都可编码为单个代码单元;GB18030:GB18030 中的代码单元由8 位组成;在GB18030 中,因为代码单元较小的缘故,每个代码点常常被映射到多个代码单元。代码点将被映射到一个、两个或四个代码单元。 5,举例:“中国北京香蕉是个大笨蛋”这是我定义的aka字符集; 各字符对应代码点为: 北00000001 京00000010 香10000001 蕉10000010 是10000100 个10001000 大10010000 笨10100000 蛋11000000 中00000100 国00001000 下面是我定义的zixia 编码方案(8位),可以看到它的编码中表示了aka字符集的所有字符对应的代码单元; 北10000001 京10000010 香00000001 蕉00000010 是00000100 个00001000 大00010000 笨00100000 蛋01000000 中10000100 国10001000 所谓文本文件就是我们按一定编码方式将二进制数据表示为对应的文本如00000001000000100000010000001000000100000010000001000000这样的文件。我用一个支持zixia编码和aka字符集的记事本打开,它就按照编码方案显示为“香蕉是个大笨蛋” 如果我把这些字符按照GBK 另存一个文件,那么则肯定不是这个,而是1100111111100011 1011110110110110 1100101011000111 1011100011110110 1011010011110011 1011000110111111 1011010110110000 110100001010 二,字符集

字符编码之间的相互转换

字符编码之间的相互转换 UTF8与GBK C++ UTF8编码转换 CChineseCode 一预备知识 1,字符:字符是抽象的最小文本单位。它没有固定的形状(可能是一个字形),而且没有值。“A”是一个字符,“€”(德国、法国和许多其他欧洲国家通用货币的标志)也是一个字符。“中”“国”这是两个汉字字符。字符仅仅代表一个符号,没有任何实际值的意义。 2,字符集:字符集是字符的集合。例如,汉字字符是中国人最先发明的字符,在中文、日文、韩文和越南文的书写中使用。这也说明了字符和字符集之间的关系,字符组成字符集(iso8859-1,GB2312/GBK,unicode)。 3,代码点:字符集中的每个字符都被分配到一个“代码点”。每个代码点都有一个特定的唯一数值,称为标值。该标量值通常用十六进制表示。 4,代码单元:在每种编码形式中,代码点被映射到一个或多个代码单元。“代码单元”是各个编码方式中的单个单元。代码单元的大小等效于特定编码方式的位数: UTF-8 :UTF-8 中的代码单元由 8 位组成;在 UTF-8 中,因为代码单元较小的缘故,每个代码点常常被映射到多个代码单元。代码点将被映射到一个、两个、三个或四个代码单元; UTF-16 :UTF-16 中的代码单元由 16 位组成;UTF-16 的代码单元大小是 8 位代码单元的两倍。所以,标量值小于 U+10000 的代码点被编码到单个代码单元中; UTF-32:UTF-32 中的代码单元由 32 位组成; UTF-32 中使用的 32 位代码单元足够大,每个代码点都可编码为单个代码单元; GB18030:GB18030 中的代码单元由 8 位组成;在 GB18030 中,因为代码单元较小的缘故,每个代码点常常被映射到多个代码单元。代码点将被映射到一个、两个或四个代码单元。 5,举例:“中国北京香蕉是个大笨蛋”这是我定义的aka字符集;各字符对应代码点为:北 00000001 京 00000010 香 10000001 蕉 10000010 是 10000100 个 10001000 大 10 010000 笨 10100000 蛋 11000000 中 00000100 国 00001000 下面是我定义的 zixia 编码方案(8位),可以看到它的编码中表示了aka字符集的所有字符对应的代码单元; 北 10000001 京 10000010 香 00000001 蕉 00000010 是 00000100 个 00001000 大 00010000 笨 00100000 蛋 01000000 中 10000100 国 10001000 所谓文本文件就是我们按一定编码方式将二进制数据表示为对应的文本如 00000001000000100000010000001000000100000010000001000000这样的文件。我用一个支持 zixia编码和aka字符集的记事本打开,它就按照编码方案显示为“香蕉是个大笨蛋”如果我把这些字符按照GBK另存一个文件,那么则肯定不是这个,而是 1100111111100011 1011110110110110 1100101011000111 1011100011110110 101101001 1110011 1011000110111111 1011010110110000 110100001010 二,字符集 1,常用字符集分类 ASCII及其扩展字符集作用:表语英语及西欧语言。位数:ASCII是用7位表示的,能表示128个字符;其扩展使用8位表示,表示256个字符。范围:ASCII从00到7F,扩展从00到FF。 ISO-8859-1字符集作用:扩展ASCII,表示西欧、希腊语等。位数: 8位,范围:从00到FF,兼容ASCII字符集。 GB2312字符集作用:国家简体中文字符集,兼容ASCII。位数:使用2个字节表示,能表示7445个符号,包括6763个汉字,几乎覆盖所有高频率汉字。范围:高字节从A1到F7, 低字节从A1到FE。将高字节和低字节分别加上0XA0即可得到编码。 BIG5字符集作用:统一繁体字编码。位数:使用2个字节表示,表示13053个汉字。范围:高字节从A1到F9,低字节从40到7E,A1到FE。 GBK字符集作用:它是GB2312的扩展,加入对繁体字的支持,兼容GB2312。位数:使用2个字节表示,

字符编码转换

Gbk码位图 各种编码之间转换的基本原理:以unicode码值为中间载体,被转换的字符先根据其原来的编码规则,解码出对应的unicode值,然后,根据unicode值在转换成目标编码。由此,就需要不同编码码值和unicode的对应关系,目前gbk和unicode之间的对应关系由查表得到,gb18030和unicode的对应关系一部分查表,一部分通过计算可得。 1.gbk to utf8

gbk两个字节表示一个字符,根据gbk与unicode对应关系,得到该字符的unicode值,得到unicode值之后,根据utf8的编码规则,判断unicode值范围,确定用来编码的字节数,确定字节数后,由utf8的编码规则分别填充每个字节; 例子: ‘破’的gbk编码为0xc6c6,两个字节分别为0xc6和0xc6,根据gbk与unicode对应关系查表得到‘破’的unicode值为0x7834;根据utf8编码规则,0x7834位于 U+0800 – U+FFFF区间,所以需要三个字节,且编码后形式为1110xxxx 10xxxxxx 10xxxxxx,0x7834对应的二进制位01111000 0011 0100,将此二进制从左到右填充x,就得到后‘破’的utf8编码11100111 10100000 10110100,也就是0xE7 0xA0 0xB4三个字节。 2.utf8 to gbk utf8变长字节编码,根据utf8的编码规则,根据收到的第一个字节大小判断构成该字符的字节数num,分别判断从当前字节起的num个字节是否符合utf8编码规则,不符合做出错处理;符合utf8的规则后,开始解码为unicode值,解码的操作就按照编码返回来,得到unicode码值后,查表就可以得到对应的gbk编码字节。 例子: ‘破’的utf8编码值为0xE7 0xA0 0xB4三个字节,对应的二进制为11100111 10100000 10110100,按照utf8的编码规则,着色部分组合到一起为对应的unicode值,于是得到unicode值0111100000110100,0x7834,查表得到0x7834对应的gbk码值0xc6c6,这样转换后的gbk编码就是0xc6,0xc6两个字节。 3.gb18030 to utf8 gb18030变长编码,1、2、4个字节;对收到的gb18030编码数据先根据第一个字节确定几个字节构成的字符,如果<0x7f,则为一个字节;否则为2或4个字节,接下来判断第二个字节的范围,若第二个字节在40 7E或者80 FE之间,则为二个字节;否则为四个字节。确定字节后,开始寻找对应的unicode值,18030与gbk不同的是,不同字节数确定unicode的方法不同,2字节的与gbk一样(个别不一致),4字节的一部分需要查表(0x81308130~0x8439FE39),4字节的其余可根据公式算出(0x90308130~0xE339FE39)。假设某字符的gb18030编码为四个字节0x91 0x31 0x84 0x36,根据范围,此四个字节需要通过公式计算,计算公式为(0x91-0x90)*12600+(0x31-0x30)*1260 +(0x84-0x81)*10+(0x36-0x30)= 0x3648,即unicode值。得到unicode值后,按照utf8编码可得到对应的utf8字节。 4.utf8 to gb18030 utf8转换unicode值在2里面以介绍,得到unicode之后,判断unicode值落在的区间,如果unicode值在0x0000-0xFFFF之间,则通过查表可得到对应的gb18030码值;若大于0xFFFF,则u = unicode-0x10000,根据以下公式得到对应的gb18030码值。 U=Unicode编码-0x10000 m1=U/12600 n1=U%12600 m2=n1/1260 n2=n1%1260 m3=n2/10 n3=n2%10 第一字节b1=m1+0x90,第二字节b2=m2+0x30,第三字节b3=m3+0x81 第四字节b4=n3+0x30

ASCII码转字符串

public static int Asc(string character) { if (character.Length == 1) { System.Text.ASCIIEncoding asciiEncoding = new System.Text.ASCIIEncoding(); int intAsciiCode = (int)asciiEncoding.GetBytes(character)[0]; return (intAsciiCode); } else { throw new Exception("Character is not valid."); } } ASCII码转字符: 单个字符 public static string Chr(int asciiCode) { if (asciiCode >= 0 && asciiCode <= 255) { System.Text.ASCIIEncoding asciiEncoding = new System.Text.ASCIIEncoding(); byte[] byteArray = new byte[] { (byte)asciiCode }; string strCharacter = asciiEncoding.GetString(byteArray); return (strCharacter); } else { throw new Exception("ASCII Code is not valid."); } } Excel专用 ///

/// ASCII码转字符串(转换为Excel列的形式:A/B/C...AA/AB/AC...BA/BB/......)

JAVA字符编码:Unicode,ISO-8859-1,GBK,UTF-8编码及相互转换

【适用范围】 适用EOS所有版本,操作系统不限,数据库不限 【问题描述和定位】 JAVA字符编码:Unicode,ISO-8859-1,GBK,UTF-8编码及相互转换 【解决方案和步骤】 1、函数介绍 在Java中,字符串用统一的Unicode编码,每个字符占用两个字节,与编码有关的两个主要函数为:1)将字符串用指定的编码集合解析成字节数组,完成Unicode-〉charsetName转换 public byte[] getBytes(String charsetName) throws UnsupportedEncodingException 2)将字节数组以指定的编码集合构造成字符串,完成charsetName-〉Unicode转换 public String(byte[] bytes, String charsetName) throws UnsupportedEncodingException 2、Unicode与各编码之间的直接转换 下面以对中文字符串"a中文"的编码转换为例,来了解各种编码之间的转换 1)Unicode和GBK 测试结果如下,每个汉字转换为两个字节,且是可逆的,即通过字节可以转换回字符串 String-GBK〉ByteArray:\u0061\u4E2D\u6587(a中文)-〉0x61 0xD6 0xD0 0xCE 0xC4 ByteArray-GBK〉String:0x61 0xD6 0xD0 0xCE 0xC4-〉\u0061\u4E2D\u6587(a中文)2)Unicode和UTF-8 测试结果如下,每个汉字转换为三个字节,且是可逆的,即通过字节可以转换回字符串 String-UTF-8〉ByteArray:\u0061\u4E2D\u6587(a中文)-〉0x61 0xE4 0xB8 0xAD 0xE 6%0x96 0x87 ByteArray-UTF-8〉String:0x61 0xE4 0xB8 0xAD 0xE6%0x96 0x87-〉\u0061\u4E2D\u6 587(a中文)

Java如何做字符串编码转换

Java 正确的做字符串编码转换 字符串的内部表示? 字符串在java中统一用unicode表示( 即utf-16 LE) , 对于String s = "你好哦!"; 如果源码文件是GBK编码, 操作系统(windows)默认的环境编码为GBK,那么编译时, JVM将按照GBK编码将字节数组解析成字符,然后将字符转换为unicode格式的字节数组,作为内部存储。 当打印这个字符串时,JVM 根据操作系统本地的语言环境,将unicode转换为GBK,然后操作系统将GBK格式的内容显示出来。 当源码文件是UTF-8, 我们需要通知编译器源码的格式,javac -encoding utf-8 ... , 编译时,JVM按照utf-8 解析成字符,然后转换为unicode格式的字节数组,那么不论源码文件是什么格式,同样的字符串,最后得到的unicode 字节数组是完全一致的,显示的时候,也是转成GBK来显示(跟OS环境有关) 乱码如何产生?本质上都是由于字符串原本的编码格式与读取时解析用的编码格式不一致导致的。 例如: String s = "你好哦!"; System.out.println( new String(s.getBytes(),"UTF-8")); //错误,因为getBytes()默认使用GBK编码,而解析时使用UTF-8编码,肯定出错。 其中 getBytes() 是将unicode 转换为操作系统默认的格式的字节数组,即"你好哦"的 GBK格式, new String (bytes, Charset) 中的charset 是指定读取 bytes 的方式,这里指定为UTF-8,即把bytes的内容当做UTF-8 格式对待。 如下两种方式都会有正确的结果,因为他们的源内容编码和解析用的编码是一致的。 System.out.println( new String(s.getBytes(),"GBK"));

字符集Unicode与UTF-8之间的转换

[字符集]Unicode和UTF-8之间的转换详解 最近在用VC++开发一个小工具,平时用惯了.NET,用起VC++最郁闷的就是字符串处理。当然最最让人难于琢磨的就是字符集,编码之间的转换。通过这几天的研究,终于明白了Unicode和UTF-8之间编码的区别。Unicode是一个字符集,而UTF-8是Unicode的其中一种,Unicode是定长的都为双字节,而UTF-8是可变的,对于汉字来说Unicode占有的字节比UTF-8占用的字节少1个字节。Unicode为双字节,而UTF-8中汉字占三个字节。 UTF-8编码字符理论上可以最多到6个字节长,然而16位BMP(Basic Multilingual Plane)字符最多只用到3字节长。下面看一下UTF-8编码表: U-00000000 - U-0000007F: 0xxxxxxx U-00000080 - U-000007FF: 110xxxxx 10xxxxxx U-00000800 - U-0000FFFF: 1110xxxx 10xxxxxx 10xxxxxx 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 xxx 的位置由字符编码数的二进制表示的位填入,越靠右的x 具有越少的特殊意义,只用最短的那个足够表达一个字符编码数的多字节串。注意在多字节串中, 第一个字节的开头"1"的数目就是整个串中字节的数目。而第一行中以0开头,是为了兼容ASCII编码,为一个字节,第二行就为双字节字符串,第三行为3字节,如汉字就属于这种,以此类推。(个人认为:其实我们可以简单的把前面的1的个数看成字节数) 为了要将Unicode转换为UTF-8,当然要知道他们的区别到底在什么地方。下面来看一下,在Unicode中的编码是怎样转换成UTF-8的,在UTF-8中,如果一个字符的字节小于0x80(128)则为ASCII字符,占一个字节,可以不用转换,因为UTF-8兼容ASCII编码。假如在Unicode中汉字“你”的编码为“u4F60”,把它转换为二进制为100111101100000,然后按照UTF-8的方法进行转换。可以将Unicode二进制从地位往高位取出二进制数字,每次取6位,如上述的二进制就可以分别取出为如下所示的格式,前面按格式填补,不足8位用0填补。

ASCII码对照表

附录A ASCII码表 对照表 A S C I I值控制字符 A S C I I值字符 A S C I I值字符 A S C I I值字符 0 00N U L0 32( s p a c e)0 64@0 96` 0 01S O H0 33!0 65A0 97a 0 02S T X0 34"0 66B0 98b 0 03 E T X0 35#0 67C0 99c 0 04 E O T0 36$0 68D 1 00d 0 05 E N D0 37%0 69E 1 01e 0 06 A C K0 38&0 70F 1 02f 0 07 B E L0 39’0 71G 1 03g 0 08 B S0 40(0 72H 1 04h 0 09H T0 41)0 73I 1 05i 0 10L F0 42*0 74J 1 06j 0 11V T0 43+0 75K 1 07k 0 12 F F0 44,0 76L 1 08l 0 13 C R0 45-0 77M 1 09m 0 14S O0 46。0 78N11 0n 0 15S I0 47/0 79O111o 0 16 D L E0 4800 80P11 2p 0 17 D C10 4910 81Q11 3q 0 18 D C20 5020 82R11 4r 0 19 D C30 5130 83S11 5s 0 20 D C40 5240 84T11 6t 0 21N A K0 5350 85U11 7u 0 22S Y N0 5460 86V11 8v 0 23 E T B0 5570 87W11 9w 0 24 C A N0 5680 88X 1 20x 0 25 E M0 5790 89Y 1 21y 0 26S U B0 58:0 90Z 1 22z 0 27 E S C0 59;0 91[ 1 23{ 0 28 F S0 60<0 92\ 1 24| 0 29G S0 61=0 93] 1 25} 0 30R S0 62>0 94^ 1 26~ 0 31U S0 63?0 95_ 1 27□

相关文档
最新文档