字符编码悉知

1、查看windows系统代码页

代码页是字符集编码的别名,也有人称"内码表"。早期,代码页是IBM称呼电脑BIOS本身支持的字符集编码的名称。当时通用的操作系统都是命令行界面系统,这些操作系统直接使用BIOS供应的VGA功能来显示字符,操作系统的编码支持也就依靠BIOS的编码。现在这BIOS代码页被称为OEM代码页。图形操作系统解决了此问题,图形操作系统使用自己字符呈现引擎可以支持很多不同的字符集编码。

早期IBM和微软内部使用特别数字来标记这些编码,其实大多的这些编码已经有自己的名称了。虽然图形操作系统可以支持很多编码,很多微软程序还使用这些数字来点名某编码。

下表列出了所有支持的代码页及其国家(地区)或者语言: 
代码页       国家(地区)或语言 
437          美国 
708          阿拉伯文(ASMO 708)
720          阿拉伯文(DOS)
850          多语言(拉丁文 I) 
852          中欧(DOS) - 斯拉夫语(拉丁文 II) 
855          西里尔文(俄语) 
857          土耳其语 
860          葡萄牙语 
861          冰岛语 
862          希伯来文(DOS)
863          加拿大 - 法语 
865          日耳曼语 
866          俄语 - 西里尔文(DOS) 
869          现代希腊语
874          泰文(Windows)
932          日文(Shift-JIS)
936          中国 - 简体中文(GB2312)
949          韩文
950          繁体中文(Big5)
1200         Unicode        
1201         Unicode (Big-Endian)
1250         中欧(Windows)
1251         西里尔文(Windows)
1252         西欧(Windows)
1253         希腊文(Windows)
1254         土耳其文(Windows)
1255         希伯来文(Windows)
1256         阿拉伯文(Windows)
1257         波罗的海文(Windows)
1258         越南文(Windows)
20866        西里尔文(KOI8-R)
21866        西里尔文(KOI8-U)
28592        中欧(ISO)
28593        拉丁文 3 (ISO)
28594        波罗的海文(ISO)
28595        西里尔文(ISO)
28596        阿拉伯文(ISO)
28597        希腊文(ISO)
28598        希伯来文(ISO-Visual)
38598        希伯来文(ISO-Logical)
50000        用户定义的
50001        自动选择
50220        日文(JIS)
50221        日文(JIS-允许一个字节的片假名)
50222        日文(JIS-允许一个字节的片假名 - SO/SI)
50225        韩文(ISO)
50932        日文(自动选择)
50949        韩文(自动选择)
51932        日文(EUC)
51949        韩文(EUC)
52936        简体中文(HZ)
65000        Unicode (UTF-7)
65001        Unicode (UTF-8)

2、ACSII、GBK与 Unicode

ASCII码

大多数计算机采用ASCII码(美国标准信息交换码),它是表示所有大小写字母、数字、标点符号和控制字符的7位编码方案。统一码(Unicode)包含ASCII码,'\u0000'到'\u007F'对应全部128个ACSII字符。在JAVA中可以使用统一码。

GBK

​GBK全称《汉字内码扩展规范》

GBK是采用单双字节变长编码,英文使用单字节编码,完全兼容ASCII字符编码,中文部分采用双字节编码。

Unicode(统一码)

如果把各种文字编码形容为各地的方言,那么Unicode就是世界各国合作开发的一种语言。

Unicode是一种字符集(charset),用两个字节就能囊括世界上多有的文字集合

统一码,也叫万国码、单一码(Unicode)是计算机科学领域里的一项业界标准,包括字符集、编码方案等。Unicode 是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。

在这种语言环境下,不会再有语言的编码冲突,在同屏下,可以显示任何语言的内容,这就是Unicode的最大好处。 就是将世界上所有的文字用2个字节统一进行编码。那样,像这样统一编码,2个字节就已经足够容纳世界上所有的语言的大部分文字了。

Unicode是国际组织制定的可以容纳世界上所有文字和符号的字符编码方案。Unicode用数字0-0x10FFFF来映射这些字符,最多可以容纳1114112个字符,或者说有1114112个码位。码位就是可以分配给字符的数字。UTF-8、UTF-16、UTF-32都是将数字转换到程序数据的编码方案。

 Unicode字符集可以简写为UCS(Unicode Character Set)。早期的Unicode标准有UCS-2、UCS-4的说法。UCS-2用两个字节编码,UCS-4用4个字节编码。

每个字符必须使用俩个字节,即用16位二进制来表示所有的字符,对于ASCII编码表里的字符,保持其编码不变,只是将长度扩展到了16位,其他国家的字符全部统一重新编码。由于传输ASCII表里的字符时,实际上可以只用一个字节就可以表示,所以,这种编码方案在传输数据比较浪费带宽,存储数据比较浪费硬盘。


所以,出现了其他编码方式

在Unicode中:汉字“字”对应的数字是23383。在Unicode中,我们有很多方式将数字23383表示成程序中的数据,包括:UTF-8、UTF-16、UTF-32。UTF是“UCS Transformation Format”的缩写,可以翻译成Unicode字符集转换格式,即怎样将Unicode定义的数字转换成程序数据。例如,“汉字”对应的数字是0x6c49和0x5b57,而编码的程序数据是:

​BYTE data_utf8[] = {0xE6, 0xB1, 0x89, 0xE5, 0xAD, 0x97}; // UTF-8编码

WORD data_utf16[] = {0x6c49, 0x5b57}; // UTF-16编码

DWORD data_utf32[] = {0x6c49, 0x5b57}; // UTF-32编码

这里用BYTE、WORD、DWORD分别表示无符号8位整数,无符号16位整数和无符号32位整数。
UTF-8、UTF-16、UTF-32分别以BYTE、WORD、DWORD作为编码单位。
“汉字”的UTF-8编码需要6个字节。“汉字”的UTF-16编码需要两个WORD,大小是4个字节。
“汉字”的UTF-32编码需要两个DWORD,大小是8个字节。
根据字节序的不同,UTF-16可以被实现为UTF-16LE或UTF-16BE,UTF-32可以被实现为UTF-32LE或UTF-32BE。

UTF-8、UTF-16、UTF-32是编码方式(encoding),是Unicode的一种组织形式

  • UTF-8的特点是对不同范围的字符使用不同长度的编码。对于0x00-0x7F之间的字符,UTF-8编码与ASCII编码完全相同。UTF-8编码的最大长度是4个字节。从上表可以看出,4字节模板有21个x,即可以容纳21位二进制数字。Unicode的最大码位0x10FFFF也只有21位。
  • UTF-16编码以16位无符号整数为单位。
  • UTF-32编码以32位无符号整数为单位。Unicode的UTF-32编码就是其对应的32位无符号整数。

unicode是字符集,将字符以字符集中索引表示,以便储存传输(计算机中只有01),这肯定不能混着用,utf-8、utf-16只是unicode的组织形式;而GBK和unicode是有对照关系可以互相转换

比如汉字“路”,在gbk中的编码为“\xc2\xb7”,对应的二进制为:“1100 0010 1011 0111”。同时“路”在Unicode字符集中的位置是“\u8def”(python中的Unicode类型),因此可以通过“\u8def”在Unicode字符集中找到“路”对应的编码为“4237”,对应的二进制为:“0100 0010 0011 0111”,由于gbk的俩个字节的高字节是为了区分中文和ASCII,所以将“1100 0010 1011 0111”高字节的“1”去掉后,就对应Unicode字符集中的0100 0010 0011 0111”

 3、java、mysql中的utf-8

 Java char在内存中只会使用Unicode字符集,所有其他编码只可能是在转换成byte[]之后才能具体体现。

一般软件里都是默认unicode,能选择的只是编码方式,即使选择了其他字符集,也是和unicode进行转换的

所以java里1个字符是两个字节(Unicode字符集一个字符两个字节,表示的是值),但用utf-8获取得到的字节数组则不一定,比如汉字就是3个字节;当需要存储时,存的肯定是unicode中的值对应的utf-8的组织形式,所以mysql中,一个汉字字符utf-8占3个字节!而gbk2个字节;

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
敬 请 注 意 为了维护您的利益,请您在签署本合同前,仔细阅读如下注意事项: 1、您已阅读本合同所有条款,并已悉知其含义; 2、您已确保提交给我公司的有关证件及资料是真实、合法、有效的; 3、您已确认自己有权在本合同上签字,并知悉签署本合同后享有的权利和承担的义务; 4、您已确知任何欺诈、违约行为均要承担相应的法律责任; 5、您将本着诚实、信用的原则,自愿签订并依约履行本合同; 6、请您使用黑色钢笔或签字笔工整地填写需要您填写的内容; 如您对本合同还有疑问之处,您可在签署之前向宁夏金聚贷款有限公司咨询。 立约人: 1、借款人: 证件名称及号码: 住所: 通讯地址: 邮政编码: 联系电话: 2、贷款人: 住所: 通讯地址: 邮政编码: 联系电话: 3、保证人: 证件名称及号码: 住所L 通讯地址: 邮政编码: 联系电话: 4、抵押人: 证件名称及号码: 住所: 通讯地址: 邮政编码: 联系电话: 5、出质人: 证件名称及号码: 住所: 通讯地址: 邮政编码: 联系电话: 本合同各方本着平等自愿、诚实信用的原则,根据有关法律、法规和规章,经协商一致,订立本合同并承诺严格履约。 本合同包括借贷条款、担保条款、违约责任条款和其他约定条款等内容。 借 贷 条 款 第一条 借款种类及用途 本合同项下的借款为 借款,借款人用于 。 第二条 借款金额 借款金额为人民币(大写) 元(¥ )。 第三条 借款期限 借款期限为(大写) 个月,即从 年 月 日起至 年 月 日止。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值