您好,欢迎访问三七文档
字符集和编码--byjeffreyyang•1、乱码现象•2、操作系统字符集解决方案•3、unicode介绍–17平面–UTF8,UTF16,UTF32•4、其他编码方式–Gb系列–Base64–URLEncode•5、其他1乱码现象•�\ufffd.bytes中超出了字符集显示范围,违反了编码规则的。对于没有包含�的编码格式的文件将无法保存文件。例如gbk.•?及3F。1、在Ancii中没有这个字符,那么就会编码成3F,2、unicode中没有对应unicode字符。•[]符合编码规则,但是在系统的字符集中目前属于未分配字符,或没有对应的字符。例如用在部分系统上utf8显示emoji.仅仅是无法正常显示,可保存。•其他:鑵鑵,¢ÀïÈöµ©1.1几个问题•1、java中char占用几个字节•2、Java中字符串–“a”lenght–“a中”–“a中𪚥”subString会怎么样•3、如果网页传递的参数值中中文是gbkURLencoding的,而我们系统的httprequest参数解析是utf8格式的如何处理。•4、哪些场景的字符编码格式转换,不会导致信息丢失。•5、为何标准的utf-8不需要bom,而utf16,utf32必须。•6、内存中字符串出现什么样的乱码后,就不能反转回来了。•7、windows记事本下联通,移动的故事,why•8、表情符号,什么情况下需要处理吗?•9、windows上文本文件保存的unicode格式,真实格式是什么•10、java哦老系统,经常看到property文件上\uxxxx的字符,这些文件是什么格式,为什么这么做?codeunit的相关述语•Acharacterisaminimalunitoftextthathassemanticvalue.•Acharactersetisacollectionofcharactersthatmightbeusedbymultiplelanguages.Example:TheLatincharactersetisusedbyEnglishandmostEuropeanlanguages,thoughtheGreekcharactersetisusedonlybytheGreeklanguage.以及unicode,gbk等•Acodedcharactersetisacharacterset,whereeachcharacterisassignedwithauniquenumber.•Acodepointisavaluethatcanbeusedinacodedcharacterset.Acodepointisa32-bitintegerdatatype,wherethelower21bitsrepresentavalidcodepointvalueandtheupper11bitsare0.•Acodeunitisabitsequenceusedtoencodeeachsinglecharacterunitofarepertoirewithineachencodingform.•Characterrepertoire(theabstractlistofcharacters)抽象字符集,我们平时表述的:ThecharacterrepertoireisanabstractlistofmorethanonemillioncharactersfoundinawidevarietyofscriptsincludingLatin,Cyrillic,Chinese,Korean,Japanese,Hebrew,andAramaic.Othersymbolssuchasmusicalnotationarealsoincludedinthecharacterrepertoire.BoththeUnicodeandGB18030standardshaveacharacterrepertoire.Asnewcharactersareaddedtoonestandard,theotherstandardalsoaddsthosecharacters,tomaintainparity.•CodeunitSize:Thecodeunitsizeisequivalenttothebitmeasurementfortheparticularencoding:–AcodeunitinUS-ASCIIconsistsof7bits;–AcodeunitinUTF-8,EBCDICandGB18030consistsof8bits;所以utf8字符长度为8个字节的n倍。–AcodeunitinUTF-16consistsof16bits;所以utf16字符长度为16个字节的n倍。–AcodeunitinUTF-32consistsof32bits.简单字符集•按照惯例,人们认为字符集和字符编码是同义词,因为使用同样的标准来定义提供什么字符并且这些字符如何编码到一系列的代码单元(通常一个字符一个单元)•例如最初的ascii,iso8859系列•iso8859-1属于单字节编码,最多能表示的字符范围是0-255,应用于英文系列。比如,字母'a'的编码为0x61=97。很明显,iso8859-1编码表示的字符范围很窄,无法表示中文字符。但是,由于是单字节编码,和计算机最基础的表示单位一致,所以很多时候,仍旧使用iso8859-1编码来表示。而且在很多协议上,默认使用该编码2、操作系统字符集解决方案•2.1、现代编码模型–Bom–CEF•2.2、操作系统编码:windows,linux–Linux下的常用配置,命令2.1现代编码模型传输编码语法:(transferencodingsyntax),用于处理上一层次的字符编码方案提供的字节序列。一般其功能包括两种:一是把字节序列的值映射到一套更受限制的值域内,以满足传输环境的限制,例如Email传输时base64或quoted-printable,都是把8位的字节编码为7位长的数据;另一是压缩字节序列的值如gzip,LZW等字符编码方案(CES:CharacterEncodingScheme),也称作serializationformat。将定长的整型值(即码元)映射到8位字节序列,以便编码后的数据的文件存储或网络传输。在使用Unicode的场合,使用一个简单的字符来指定字节顺序是大端序或者小端序(但对于UTF-8来说并不需要专门指明字节序)字符编码表:(CEF:CharacterEncodingForm),也称为storageformat“.是将编码字符集的非负整数值(即抽象的码位)转换成有限比特长度的整型值(称为码元codeunits)的序列。编码字符集(CCS:CodedCharacterSet)是将字符集中每个字符映射到1个坐标抽象字符表(Abstractcharacterrepertoire)是一个系统支持的所有抽象字符的集合,更久远的是硬件2.1serializationformat的实现BOM•BOM(ByteOrderMark),字节顺序标记,出现在文本文件头部,Unicode编码标准中用于标识文件是采用哪种格式的编码。•BigEndian高字节在前,低字节在后•和LittleEndian低字节在前,高字节在后•UTF8不需要BOM来表明字节顺序,但可以用BOM来表明编码方式。字符“ZeroWidthNo-BreakSpace”的UTF-8编码是EFBBBF。所以如果接收者收到以EFBBBF开头的字节流,就知道这是UTF-8编码了。Windows就是使用BOM来标记文本文件的编码方式的•。编码表示(十六进制)表示(十进制)UTF-8EFBBBF239187191UTF-16(大端序)FEFF254255UTF-16(小端序)FFFE255254UTF-32(大端序)0000FEFF00254255UTF-32(小端序)FFFE000025525400GB-180308431953313249149512.1Character的相关述语•字符编码(characterencoding),字符映射(charactermap),字符集(characterset)或者代码页,在历史上往往是同义概念,即字符表(repertoire)中的字符如何编码为码元的流(streamofcodeunits)–通常每个字符对应单个码元。•码元(CodeUnit,也称“代码单元”)是指一个已编码的文本中具有最短的比特组合的单元。对于UTF-8来说,码元是8比特长;对于UTF-16来说,码元是16比特长;对于UTF-32来说,码元是32比特长[1]。码值(CodeValue)是过时的用法。•代码页通常意味着面向字节的编码,但强调是一应用于不能语言的编码方案的集合.著名的如Windows代码页系列,IBM/DOS代码页系列.•Unix或Linux不使用代码页概念,它们用charmap•编码空间:encodingspace。简单说就是包含所有字符的表的维度。可以用一对整数来描述,例如:GB2312汉字编码空间是94x94。可以用一个整数来描述,例如:ISO-8859-1的编码空间是2562.1字符编码表storageformat•这对于定长编码来说是个到自身的映射(nullmapping),•但对于变长编码来说,该映射比较复杂,把一些码位映射到一个码元,把另外一些码位映射到由多个码元组成的序列。例如,使用16比特长的存储单元保存数字信息,系统每个单元只能够直接表示从0到65,535的数值,但是如果使用多个16位单元就能够表示更大的整数。这就是CEF的作用,它可以把Unicode从0到140万的码空间范围的每个码位映射到单个或多个在0到65,5356范围内的码值。最简单的字符编码表就是单纯地选择足够大的单位,以保证编码字符集中的所有数值能够直接编码(一个码位对应一个码值)。这对于能够用使用八比特组来表示的编码字符集(如多数传统的非CJK的字符集编码)是合理的,对于能够使用十六比特来表示的编码字符集(如早期版本的Unicode)来说也足够合理。但是,随着编码字符集的大小增加(例如,现在的Unicode的字符集至少需要21位才能全部表示),这种直接表示法变得越来越没有效率,并且很难让现有计算机系统适应更大的码值。因此,许多新近版本Unicode的系统,或者将Unicode码位对应为可变长度的8位字节序列的UTF-8,或可变长度的16位序列的UTF-16。.2.2Window&linuxwindows操作系统localeCodepage映射(936==gbk,)charactermapWindows系统代码字linux操作系统编码GBK||UTF8||…charmap(即上面的5层模型)UnicodepointcodeLinux代码字,同unicodepiointcode一一对应2.2windows•windows中Codepage下的charactermap同BIOS代码页也被称为OEM代码页。操作系统使用自己的字符呈现引擎(renderingengine),可以支持多个不同的字符集编码,这类代码页被称作ANSI代码页。Window查看代码也:chcp一般是936代表gbk那为什么gbk的可以显示日文?(knownascharacterencodingsinotheroperatingsystems)usedinMicrosoftWindowsfromthe1980sand1990s.WindowscodepagesweregraduallysupersededwhenUnicodewasimplementedinWindows,althoughtheyarestillsupportedbothwit
本文标题:字符集和编码
链接地址:https://www.777doc.com/doc-5306117 .html