《字符集和编码ppt课件.pptx》由会员分享,可在线阅读,更多相关《字符集和编码ppt课件.pptx(47页珍藏版)》请在三一办公上搜索。
1、字符集和编码,- by jeffrey yang,1、乱码现象2、操作系统字符集解决方案3、unicode 介绍17平面UTF8,UTF16,UTF324、其他编码方式Gb系列Base64URLEncode5、其他,1乱码现象, ufffd. bytes中超出了字符集显示范围,违反了编码规则的。 对于没有包含的编码格式的文件将无法保存文件。例如gbk. ?及3F 。1、在 Ancii中没有这个字符,那么就会编码成 3F,2、unicode中没有对应unicode字符。 符合编码规则, 但是在系统的字符集中目前属于未分配字符,或没有对应的字符。例如用在部分系统上utf 8显示emoji. 仅仅是
2、无法正常显示,可保存。其他:鑵鑵, ,1.1几个问题,1、java 中char 占用几个字节2、Java中字符串“a”lenght“a中”“a中” subString 会怎么样3、如果网页传递的参数值中中文是gbk URL encoding 的,而我们系统的http request 参数解析是utf8格式的如何处理。4、哪些场景的字符编码格式转换,不会导致信息丢失。5、为何标准的utf-8不需要bom,而utf16,utf32 必须。6、内存中字符串出现什么样的乱码后,就不能反转回来了。7、windows 记事本下联通,移动的故事, why8、表情符号,什么情况下需要处理吗?9、windows
3、 上文本文件保存的unicode 格式,真实格式是什么10、java 哦老系统,经常看到 property 文件上 uxxxx 的字符,这些文件是什么格式,为什么这么做?,code unit 的相关述语,Acharacteris a minimal unit of text that has semantic value.Acharacter setis a collection of characters that might be used by multiple languages. Example:The Latin character set is used by English a
4、nd most European languages, though the Greek character set is used only by the Greek language. 以及unicode , gbk等Acoded character setis a character set, where each character is assigned with a unique number.Acode pointis a value that can be used in acoded character set. A code point is a 32-bit intege
5、r data type, where the lower 21 bits represent a valid code point value and the upper 11 bits are 0.Acode unitis a bit sequence used to encode each single character unit of a repertoire within each encoding form.Character repertoire (the abstract list of characters)抽象字符集,我们平时表述的: The character reper
6、toire is an abstract list of more than one million characters found in a wide variety of scripts includingLatin, Cyrillic, Chinese, Korean, Japanese, Hebrew, and Aramaic. Other symbols such as musical notation are also included in the character repertoire. Both the Unicode andGB18030standards have a
7、 character repertoire. As new characters are added to one standard, the other standard also adds those characters, to maintain parity.Code unit Size: The code unit size is equivalent to the bit measurement for the particular encoding:A code unit inUS-ASCIIconsists of 7 bits;A code unit inUTF-8, EBCD
8、ICandGB18030consists of 8 bits; 所以utf8字符长度为8个字节的n倍。A code unit inUTF-16consists of 16 bits; 所以utf16字符长度为16个字节的n倍。A code unit inUTF-32consists of 32 bits.,简单字符集,按照惯例,人们认为字符集和字符编码是同义词, 因为使用同样的标准来定义提供什么字符并且这些字符如何编码到一系列的代码单元(通常一个字符一个单元)例如最初的ascii , iso8859 系列iso8859-1属于单字节编码,最多能表示的字符范围是0-255,应用于英文系列。比如,
9、字母a的编码为0 x61=97。很明显,iso8859-1编码表示的字符范围很窄,无法表示中文字符。但是,由于是单字节编码,和计算机最基础的表示单位一致,所以很多时候,仍旧使用iso8859-1编码来表示。而且在很多协议上,默认使用该编码,2、操作系统字符集解决方案,2.1、现代编码模型BomCEF2.2、操作系统编码:windows , linuxLinux 下的常用配置,命令,2.1现代编码模型,2.1 serialization format 的实现BOM,BOM(Byte Order Mark),字节顺序标记,出现在文本文件头部,Unicode编码标准中用于标识文件是采用哪种格式的编码
10、。Big Endian高字节在前,低字节在后 和Little Endian低字节在前,高字节在后UTF8不需要 BOM 来表明字节顺序,但可以用 BOM 来表明编码方式。字符 “Zero Width No-Break Space” 的 UTF-8 编码是 EF BB BF。所以如果接收者收到以 EF BB BF 开头的字节流,就知道这是 UTF-8编码了。Windows 就是使用 BOM 来标记文本文件的编码方式的。,2.1 Character 的相关述语,字符编码(character encoding),字符映射(character map),字符集(character set)或者代码页,
11、在历史上往往是同义概念,即字符表(repertoire)中的字符如何编码为码元的流(stream of code units)通常每个字符对应单个码元。码元(Code Unit,也称“代码单元”)是指一个已编码的文本中具有最短的比特组合的单元。对于UTF-8来说,码元是8比特长;对于UTF-16来说,码元是16比特长;对于UTF-32来说,码元是32比特长1。码值(Code Value)是过时的用法。代码页通常意味着面向字节的编码,但强调是一应用于不能语言的编码方案的集合.著名的如Windows代码页系列,IBM/DOS代码页系列.Unix或Linux不使用代码页概念,它们用charmap编码
12、空间: encoding space 。简单说就是包含所有字符的表的维度。可以用一对整数来描述,例如:GB2312汉字编码空间是94 x 94。可以用一个整数来描述,例如:ISO-8859-1的编码空间是256,2.1字符编码表,storage format这对于定长编码来说是个到自身的映射(null mapping),但对于变长编码来说,该映射比较复杂,把一些码位映射到一个码元,把另外一些码位映射到由多个码元组成的序列。例如,使用16比特长的存储单元保存数字信息,系统每个单元只能够直接表示从0到65,535的数值,但是如果使用多个16位单元就能够表示更大的整数。这就是CEF的作用,它可以把U
13、nicode从0到140万的码空间范围的每个码位映射到单个或多个在0到65,5356范围内的码值。最简单的字符编码表就是单纯地选择足够大的单位,以保证编码字符集中的所有数值能够直接编码(一个码位对应一个码值)。这对于能够用使用八比特组来表示的编码字符集(如多数传统的非CJK的字符集编码)是合理的,对于能够使用十六比特来表示的编码字符集(如早期版本的Unicode)来说也足够合理。但是,随着编码字符集的大小增加(例如,现在的Unicode的字符集至少需要21位才能全部表示),这种直接表示法变得越来越没有效率,并且很难让现有计算机系统适应更大的码值。因此,许多新近版本Unicode的系统,或者将U
14、nicode码位对应为可变长度的8位字节序列的UTF-8,或可变长度的16位序列的UTF-16。.,2.2Window & linux,2.2 windows,windows 中Codepage下的character map 同 BIOS代码页也被称为OEM代码页。 操作系统使用自己的字符呈现引擎(rendering engine),可以支持多个不同的字符集编码,这类代码页被称作ANSI代码页。Window 查看代码也:chcp 一般是936代表gbk 那为什么gbk 的可以显示日文? http:/ code pagesare sets of characters orcode pages(k
15、nown ascharacter encodingsin other operating systems) used inMicrosoft Windowsfrom the 1980s and 1990s. Windows code pages were gradually superseded whenUnicode was implemented in Windows, although they are still supported both within Windows and other platforms.在Windows平台下查看和修改字符集一、查看字符集:chcp, linu
16、x 看下就明白了 gunzip -c /usr/share/i18n/charmaps/GBK.gz 查看缺省编码: locale,2.2 Linux 字符集,Linux下几个i18n(internationalization)相关的目录和文件/etc/sysconfig/i18n的文件LANG=zh_CN.GB2312 (指定当前操作系统的字符集)SUPPORTED=zh_CN.GB2312(指定当前操作系统支持的字符集)SYSFONT=lat0-sun16(指定当前操作系统的字体)/usr/share/i18n/charmaps这个目录下存放了该Linux操作系统可用字符集的安装包,如果你
17、的操作系统上没有安装某个字符集可以到这个目录下寻找安装包。例如:GB2312的安装包名字为“GB2312.gz/usr/share/i18n/locales这个目录下存放了和所有语言包对应的locale信息,例如:zh_CN.GB2312是一个完整的字符集,其中zh表示语言,CN表示这个语言使用的国家,GB2312表示这个语言所对应的编码/usr/lib/locale 这个目录存放的都是目前操作系统上已经安装好的locale信息,2.2Linux 字符集,Linux下与i18n相关的几个SHELL命令locale命令 (用来查看系统locale的信息)localedef命令(用来安装系统loc
18、ale的信息)Linux下安装GB2312的示例Step 1: 到Linux字符集的安装包目录下cd /usr/share/i18n/charmapsStep 2: 解压该目录下的GB2312.gzgunzip GB2312.gzStep 3: 安装字符集localedef -f GB2312 -i zh_CN /usr/lib/locale/zh_CN.GB2312Step 4: 查看是否已经定义locale -a | grep GB2312Step 5: 安装完毕后,你只要修改/etc/sysconfig/i18n文件就可以修改当前的字符集为新安装的zh_CN.GB2312字符,2.2 l
19、inux commond,iconv l 列举所有已知的字符集iconv -f utf-8 -t gb2312 aaa.txt bbb.txt这个命令读取aaa.txt文件,从utf-8编码转换为gb2312编码,其输出定向到bbb.txt文件查看文件编码file命令 file test.sql 文件名编码转换 convmv -f GBK -t UTF-8 *.mp3 现在用linux,原来在windows里的文件都是用GBK编码的.copy到linux下是乱码,文件内容可以用iconv来转换可是好多中文的文件名还是乱码,找到个可以转换文件名编码的命令,就是convmv. convmv命令详细
20、参数 例如 convmv -f GBK -t UTF-8 *.mp3 不过这个命令不会直正的转换,你可以看到转换前后的对比.如果要直正的转换要加上参数 -notest convmv -f GBK -t UTF-8 -notest *.mp3,3 Unicode 介绍,3.1、unicode 的五层模型3.2、 Unicode的编码空间3.3、UCS2与UCS4,以及系统,应用支持情况3.4、utf8, utf16,utf323.5、表情符号3.6、3个编码fileencoding, encoding, termencoding,3.1 Unicode 5层模型,http:/scripts.si
21、l.org/cms/scripts/page.php?site_id=nrsi&item_id=IWS-Chapter03第一层就是确定字符的范围,即要支持哪些字符第二层是将字符和数字对应起来(ucs2 和ucs4)统一码的编码方式与ISO 10646的通用字符集概念相对应。目前实际应用的统一码版本对应于UCS-2,使用16位的编码空间。也就是每个字符占用2个字节。其他编码方法第二第三都是相同的第三层的编码的实现用基本数据类型表示字符(Character encoding form)包括UTF-8、UTF-16、UTF-32。 “UCS Transformation Format”的缩写,第四
22、层的字节序 (bom)例如,“字”的UTF-32编码是0 x5b57,如果用little endian表示,字节流是“57 5b 00 00”。如果用big endian表示,字节流是“00 00 5b 57”第五层,传递转义如base64等,3.1,所以我们可以说字符集有GBK, Unicode, ASCii ,iso 系列 而utf8,utf16, utf32是Unicode对应编码方式, GBK 字符集的编码方式就是GBK, iso也有自己对于的编码方式 ,如iso8859-1Java: UCS2 (UTF-16双字节) ;jdk 5以后: UCS2 为基础UCS4部分字符以UTF-16
23、四字节Linux, windows : UCS4,3.2 unicode的编码空间,Unicode的编码空间从U+0000到U+10FFFF,共有1,112,064个码位(code point)可用来映射字符. Unicode的编码空间可以划分为17个平面(plane),每个平面包含216(65,536)个码位。17个平面的码位可表示为从U+xx0000到U+xxFFFF,其中xx表示十六进制值从0016到1016,共计17个平面。第一个平面称为基本多语言平面(Basic Multilingual Plane,BMP),或称第零平面(Plane 0)。,3.3Unicode的编码空间,其他平面
24、称为辅助平面(Supplementary Planes)。基本多语言平面内,从U+D800到U+DFFF之间的码位区段是永久保留不映射到Unicode字符。UTF-16就利用保留下来的0 xD800-0 xDFFF区段的码位来对辅助平面的字符的码位进行编码。,总,Unicode 仅仅是字符集。包含( U+0000到U+10FFFF )UCS-2(for 2-byte Universal Character Set),只包含bmp 第一个平面的字符。比较局限。UCS-4(for 4-byte Universal Character Set)全部字符GBK,GB2312,ASCI, ISO8859
25、-1都是Unicode 的子集。,Unicode的实现方式不同于编码方式。一个字符的Unicode编码是确定的。但是在实际传输过程中,由于不同系统平台的设计不一定一致,以及出于节省空间的目的,对Unicode编码的实现方式有所不同。Unicode的实现方式称为Unicode转换格式(Unicode Transformation Format,简称为UTF)UTF8UTF16 UTF32可以表示全部的Unicode,UTF8UTF16 UTF32,All code points in the BMP are accessed as a single code unit inUTF-16encod
26、ing and can be encoded in one, two or three bytes inUTF-8.Code points in Planes 1 through 16 (supplementary planes) are accessed as surrogate pairs in UTF-16 and encoded in four bytes in UTF-8.UTF8 最初16个字节,对于bmp字符13个字节,4个字节的UTF8 用于定义(Unicode6.1定义范围:010 FFFF,包括emoji表情), 56个字节的utf8 已经被废弃。,3.3 UCS-2与UC
27、S-4,UCS2其实只能表示UCS4中BMP(及0号平面)的部分。对于BMP的UCS2和UCS4编码的转换很简 单,UCS2-UCS4,只要在编码前两加个全是0的字节,而UCS4-UCS2就是把编码的前两个全为0的字节去掉。UCS2也就只能 表示BMP时而定义的=65535个字符,3.3 常见环境底层,https:/en.wikipedia.org/wiki/UTF-16#UsageUTF-16 is used for text in the OS API inMicrosoft Windows 2000/XP/2003/Vista/7/8/CE.11OlderWindows NTsystem
28、s only support UCS-2.12Javaoriginally used UCS-2, and added UTF-16 supplementary character support inJ2SE 5.0.JavaScriptuses UCS-2,3.4 UCS-2 与UTF-16,Utf-16 UTF-16 可以表示的字符集 UCS-2优点:绝大部分的文字都可以用两个字节编码,对于CJK文字是比较节省空间的;文本处理比UTF-8方便得多,3.4 UCS-4 与UTF-32,Utf-32 定长4字节编码方案Ucs-4 完全等价与UTF-32 LE,3.5 emoji 表情,man
29、y “emoji” have been defined in Unicode 6. But many emoji are outside the BMP, so cant be encoded in UCS-2而java 语言是基于ucs-2的,这就会导致在java 语言中,emoji的字符长度可以计算出错。Java 环境本身的显示为”但这不影响字符的输出,以及在网页端的展示。,3.5 Emoji Unicode Tables and mapping utf8,http:/apps.timwhitlock.info/emoji/tables/unicodehttps:/en.wikipedia
30、.org/wiki/Emoji,3.6 乱码-3个编码,Fileencoding : 文件的encodingEncoding: 内存中的encodingTermencoding: 客户端的 encoding,3.6java 中的乱码,Java 的字符串在内存中是unicode(utf16),能够表示最大字符集.在Java运行时的世界里,乱码产生(编译时产生的这里不管)的源头存在于两个地方,其实也就是我上面提及的两个函数(发生端的getBytes ,和接受端byteToString),getBytes(String charset) 如果按照指定的charset去对一个unicode Strin
31、g进行编码,但是发现这个编码体系里(比如iso-8859-1)没有这个字符,那么就会编码成3F(其实就是一个问号),这样就造成了信息的丢失了,是不可以恢复的。 new String(byte bytes,String charset) 如果对一个字节数组按照指定的字符集去解码,但是字符集突然对其中一段编码不认识的时候,例如某一段字节数组按照UTF-8解码的时候,不认识了,到了unicode字符串这边就是”uFFFD”,其实这个东西叫做REPLACEMENT CHARACTER,显示的是一个问号ByteToString, 很多时候框架已经帮我们做了这个转换,甚至在读取流时就是用字节流(例如:In
32、putStreamReader ), 如果框架转换的编码同发送端不一致,那么我们需要先 tobyte(“框架编码”), 然后bytesTOString(“发送端编码”)。 如果“框架编码”不是无损编码,那么可能带信息丢失。,4、其他编码方式,AsciiIso 系列unicode 字符集 以及utf系列编码(前面已介绍)Gb系列base64编码UrlencodeJava 的 properties,ASCII,1, 常用字符集分类 ASCII及其扩展字符集 作用:表语英语及西欧语言。 位数:ASCII是用7位表示的,能表示128个字符;其扩展使用8位表示,表示256个字符。 范围:2。2,ASCI
33、I从00到7F,扩展从00到FF。 ISO-8859-1字符集 作用:扩展ASCII,表示西欧、希腊语等。 位数:8位, 范围:从00到FF,兼容ASCII字符集。ASCII使用数字32到 127来表示所有的英文字母,比如空格是32,字母A是65等等。使用7个比特就可以存储所有这样字符。那个时代的大多数计算机使用8个比特来,所以你不但可以存储全部的ASCII,而且还有一个比特可以多出来用作其他。如果你想,你可以把它用作你不可告人的目的。32以下的码字是不可打印的,它们属于控制字符,像7表示响铃,12表示打印机换纸。,Iso 8859 系列,ISO/IEC 8859-1又称Latin-1或“西欧
34、语言”ISO/IEC 8859-2又称Latin-3或“南欧语言”ISO/IEC 8859-3又称Latin-3或“南欧语言”ISO/IEC 8859-4又称Latin-4或“北欧语言”他们都是用一个字节表示,最多256个字符,前128个兼容Ascii 后128位为各自语言的个性字符。,GBK 编码,BIG5,GB2312字符集 作用:国家简体中文字符集,兼容ASCII。 位数:使用2个字节表示,BIG5字符集 作用:统一繁体字编码。 位数:使用2个字节表示,表示13053个汉字。 GBK字符集 作用:它是GB2312的扩展,加入对繁体字的支持,位数:使用2个字节表示,可表示21886个字符。
35、 范围:高字节从81到FE,低字节从40到FE。 GB18030字符集 作用:它解决了中文、日文、朝鲜语等的编码,兼容GBK。 位数:它采用变字节表示(1 ASCII,2,4字节)。,文字显示流程,应用程序的字符串 ,按应用的正确的字符集,转变为操作系统内码,(例如ansi 内码, 现代操作系统基本都是unicode (utf16)内码)。(早期还有一不依赖操作系统的BIOS代码页也被称为OEM代码页)每个unicode 同font 下位图一一对应。如果位图不存在那么显示 如果unicode解析出错,那么ascii对应 3f (?), 其他对应 ufffd.,base64,Base64是一种基
36、于64个可打印字符来表示二进制数据的表示方法。由于2的6次方等于64,所以每6个比特为一个单元,对应某个可打印字符。三个字节有24个比特,对应于4个Base64单元,即3个字节需要用4个可打印字符来表示。它可用来作为电子邮件的传输编码。在Base64中的可打印字符包括字母A-Z、a-z、数字0-9,这样共有62个字符, 还有两个是“+”和“/”,Base 64 等号,如果要编码的字节数不能被3整除,最后会多出1个或2个字节,那么可以使用下面的方法进行处理:先使用0字节值在末尾补足,使其能够被3整除,然后再进行base64的编码。在编码后的base64文本后加上一个或两个=号,代表补足的字节数。
37、也就是说,当最后剩余一个八位字节(一个byte)时,最后一个6位的base64字节块有四位是0值,最后附加上两个等号;如果最后剩余两个八位字节(2个byte)时,最后一个6位的base字节块有两位是0值,最后附加一个等号。,Base 64 索引表,urlencode,针对get请求中的参数名和参数值:可能因为编码以及特殊字符引起的错误。而进行的一个编码。对于中文,转换为16进制的表示发,每个字节前用%分隔。Eg : 中国URLEncoder.encode(中国, UTF-8) =%E4%B8%AD%E5%9B%BDURLEncoder.encode(中国, “GBK) =%D6%D0%B9%F
38、A,unicode 的表示形式,Html : 字 (10进制)Java : uxxxx国际化resources.properties文件,中文字符转换为Unicode字符:native2ascii -reverse -encoding GB2312 resources.properties tmp.propertiesnative2ascii resources.properties tmp.properties 或者 native2ascii -encoding Unicode resources.properties tmp.properties注意:Unicode首字母必须大
39、写国际化resources.properties文件,Unicode字符转换为中文字符:native2ascii -reverse -encoding GB2312 resources.properties tmp.propertieschar是Java中的保留字,与别的语言不同的是,char在Java中是16位的,因为Java用的是Unicode。不过8位的ASCII码包含在Unicode中,是从0127的。,Java 老版本的property 中 u,Properties interprets input files always asISO-8859-1(first unicode pa
40、ge) and also saves to that encoding. This is why it needs theuXXXXescapes and creates them on saving. Although since Java version 1.6 Properties allows to read the input from a Reader object so that you would be able to make your own proprietary UTF-8 based properties file format.,其他,数据库连接,Server 编码
41、对应字符集 client编码对应 字符集Server 的编码是utf8, client,linux下查看和修改字符集一、查看服务器字符集1、查看当前服务器字符集#locale2、查看服务器支持的字符集#locale -a二、修改/etc/sysconfig/i18n 文件,设置字符集类似以下内容#LANG=en_US.UTF-8#SYSFONT=latarcyrheb-sun16LANG=zh_CN.UTF-8SYSFONT=lat0-sun16三、让设置的字符集生效#source /etc/sysconfig/i18n另也可在 /etc/profile (全局) 或者 /.bashrc (单个用户)设置 Linux 系统的环境变量export LANG=zh_CN.GB18030 临时生效设置linux 文件格式的判断次序setfileencodings=ucs-bom,utf-8,cp936,gb18030,big5,euc-jp,euc-kr,latin1,编程,TKS!,
链接地址:https://www.31ppt.com/p-1328779.html