[JavaMail]10详解字符编码和MimeUtilityURLDecoderURLEncoder_第1页
[JavaMail]10详解字符编码和MimeUtilityURLDecoderURLEncoder_第2页
免费预览已结束,剩余6页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

个人收集整理-ZQJavaMail10详解字符编码和MimeUtilityURLDecoderURLEncoder一、邮件中的编码. 的中的都是只能存放码的,当邮件中有非时,例如邮件的主题是中文时,我们可以把邮件的中文主题以(当然也可以使用其它编码,如)规则来进行编码,并以指定格式的字符串来表示。b5E2R。b5E2R。若邮件的主题是“中”,我们想用编码。那么“中”字的的编码是,就用特定格式的码来表示主题“中”,则是:: (这个是规范的格式)。p1Ean。p1Ean。的中的也是只能存放码的,例如邮件的有一个附件的文件名是中文时,我们可以把附件名进行编码,并以指定格式的字符串来表示,注意差别是这时候的字符串格式和前面不同。格式:(这个是规范的格式)。DXDiT。DXDiT。为什么在使用一个邮件中使用两种格式,就不得而知了,可能是方便下载附件吧。二、的编码和解码、编码规则? ? ? :字符编码: 最常用的 有 和 两种。在对二进制文件或者中文文本进行转化时, 得到的“字节串”比 更短。在对英文文本进行转化时, 得到的“字节串”比 更短。RTCrp。RTCrp。例: : 例: : 、 这是一个工具类,提供各种相关的功能。该类有一组根据规范来对头进行编码和解码的方法。请注意,在一般情况下,这些方法并不需要被使用,如和时。使用这些“高层次”方法时会自动编码和解码。这些方法只有在使用及方法操作头时才需要被使用。5PCzV。5PCzV。 规定邮件头只能包含字符。当包含有非字符的邮件头必须进行编码以使邮件头只包含字符。基本上,这个过程涉及使用或规则来编码某些字符。 中详细说明了这一点。jLBHr。jLBHr。在中是为字符。是的一个子集(占用范围 )。一个只包含字符的是邮件安全的。若含有非字符则必须进行编码。此步骤增加了一个额外的复杂性,是因为还不是一种广泛使用的字符集,有人可能首先想到把的字符集编码转换成其它一种字符集编码,然后来进行传输。请注意,要获得邮件安全字符串的实际字节(例如,通过发送),必须做的是:xHAQX。xHAQX。 ();假设、的和方法给赋的值是一个只包含字符的字符串。那么这些方法的调用者必须确保他们传递的值不包含非字符。这个类的方法帮忙做这些事情。LDAYt。LDAYt。、的方法获取的值时。这些值是按 规范编码的,那么就必须解码为编码。这个类的方法帮忙做这些事情。几个系统属性严格控制规范的一致性。请注意,这些都不是的属性,但必须设置为全局系统属性。属性控制编码字符的解码。规范要求,编码字符必须以一个空白分隔符为开始。一些邮件错误的包含了编码字符在一个词的中间。如果系统属性设置为,系统就会企图解码这些非法的编码字符。默认值是。Zzz6Z。Zzz6Z。属性控制非”类型的 的的选择。如果在的系统属性设置为“”,必要时将使用这种编码。默认值是。系统属性用来指定默认的字符集。通常情况下,默认的字符集是来自默认的字符集,在系统属性中指定。大多数应用程序将有没有必要明确地设置默认的字符集。邮件使用的默认的字符集是不同于存放在系统中文件的字符集。dvzfv。dvzfv。属性用来控制头中未知值,当递给解码方法,会导致异常。如果设置为“”,未知的值被忽略和被假设为编码。否则,未知值会导致以抛出异常。rqyn1。rqyn1。静态方法.解码 ( , ) . ( ) , , * .解码根据定义为*的“非结构化”头。这个字符串使用中第章中指定的算法解码方式。如果字符集转换失败,则抛出一个例外。如果不是 编码格式的头,则原样返回。Emxvx。Emxvx。 ( ) .使用 和 规则对一个编码字符串进行解码。如果解析失败,则抛出一个例外。否则,就传输解码,然后把编码转换成字符。如果字符集转换失败,则抛出一个例外。SixE2。SixE2。.编码 (, ) . (, , ) . ( ) . ( , , ) . ( ) . ( , , ) .获取类型 ( ) () . () , .获取系统字符集编码 () . ( ) . ( ) . ( , ) , .三、的编码和解码、编码规则:字符编码:语言:编码后的字符串例编码用单引号分成了三段,分别是字符集()、语言(空)和过的文件名、和 格式解码的实用工具类。该类包含了方法( , )可以将一个字符串从 格式中解码。假定已编码的字符串中只能是以下字符: 到 、 到 、 到 和 、. 以及 *。允许有 字符,但是将它解释为特殊转义序列的开始。如:。6ewMy。6ewMy。转换中使用以下规则:.字母数字字符 到 、 到 和 到 保持不变。.特殊字符 .、* 和 保持不变。.加号 转换为空格字符 。.将把 格式序列视为一个字节,其中为 位的两位十六进制表示形式(是进制数,其中的一位表示一个)。然后,所有连续包含一个或多个这些字节序列的子字符串,将被其编码可生成这些连续字节的字符所代替。可以指定对这些字符进行解码的编码机制,或者如果未指定的话,则使用平台的默认编码机制。kavU4。kavU4。该解码器处理非法字符串有两种可能的方法。一种方法是不管该非法字符,另一种方法是抛出异常。解码器具体采用哪种方法取决于具体实现。y6v3A。y6v3A。 ( , ) 使用指定的编码机制对 字符串解码。例子: ” ”;是“中”字的编码的 表示方式。(, );则指定用编码来进行解码。例子: ;(, );是“中”字的编码的 表示方式。则指定用编码来进行解码。 该转换过程正好与类使用的过程相反。 ( , ) 使用指定的编码机制将字符串转换为格式。、特殊符号的编码和解码.空格空格在邮件中存储或者在网页的中则是。空格用(“,”);来进行编码是会被转换为”。而在解码时和都被解码为空格。M2ub6。M2ub6。在邮件中存储仍然是。那么对含有的字符串进行解码时就会把解码为空格,这样就和事实不符了。在邮件中存储仍然是。编码和解码没有问题。四、字符编码字符编码是计算机技术的基石,想要熟练使用计算机,就必须懂得字符编码的知识。不注意的人可能对这个不在意,但这些名词有时候实在让人迷惑,对想学习计算机知识的人来说,搞懂它也十分重要,我也是在学习中慢慢了解了一些这方面的知识。0YujC。0YujC。一、码和非码. 码在计算机内部,所有的信息最终都表示为一个二进制的字符串。每一个二进制位()有和两种状态,因此八个二进制位就可以组合出种状态,这被称为一个字节()。也就是说,一个字节一共可以用来表示种不同的状态,每一个状态对应一个符号,就是个符号,从到。eUts8。eUts8。上个世纪年代,美国制定了一套字符编码,对英语字符与二进制位之间的关系,做了统一规定。这被称为码,一直沿用至今。sQsAE。sQsAE。码一共规定了个字符的编码,比如空格“”是(十进制的,用二进制表示就是),大写的字母是(二进制)。这个符号(包括个不能打印出来的控制符号),只占用了一个字节的后面位,最前面的位统一规定为。具体的可以到这个网页上去查下: GMsIa。GMsIa。、非编码英语用个符号编码就够了,但是用来表示其他语言,个符号是不够的。比如,在法语中,字母上方有注音符号,它就无法用码表示。于是,一些欧洲国家就决定,利用字节中闲置的最高位编入新的符号。比如,法语中的的编码为(二进制)。这样一来,这些欧洲国家使用的编码体系,可以表示最多个符号。TIrRG。TIrRG。但是,这里又出现了新的问题。不同的国家有不同的字母,因此,哪怕它们都使用个符号的编码方式,代表的字母却不一样。比如,在法语编码中代表了,在希伯来语编码中却代表了字母 (),在俄语编码中又会代表另一个符号。但是不管怎样,所有这些编码方式中,表示的符号是一样的,不一样的只是的这一段。7EqZc。7EqZc。至于亚洲国家的文字,使用的符号就更多了,汉字就多达万左右。一个字节只能表示种符号,肯定是不够的,就必须使用多个字节表达一个符号。比如,简体中文常见的编码方式是,使用两个字节表示一个汉字,所以理论上最多可以表示个符号。lzq7I。lzq7I。一、和正如上一节所说,世界上存在着多种编码方式,同一个二进制数字可以被解释成不同的符号。因此,要想打开一个文本文件,就必须知道它的编码方式,否则用错误的编码方式解读,就会出现乱码。为什么电子邮件常常出现乱码?就是因为发信人和收信人使用的编码方式不一样。解释:同一个文本文件,假设内容是用英语写的,在英语编码的情况下,每个字符会和一个二进制数对应(如类似),然后存到计算机中,这时把这个英语文件发给一个俄语国家的用户,计算机传输的是二进制流,即之类的数据,到了俄语用户这方,需要有它的俄语编码方式进行解码,把每个二进制流转为字符显示,由于俄语编码表中对每串二进制流数据的解释方式不同,同一个数据如在英语中可能代表,而在俄语中则代表,这样就会产生乱码,这是我个人的理解。zvpge。zvpge。编码、日文编码等也是非编码,是要通过转换表()转换成编码的,要不怎么显示出来呢?可以想象,如果有一种编码,将世界上所有的符号都纳入其中。每一个符号都给予一个独一无二的编码,那么乱码问题就会消失。这就是,就像它的名字都表示的,这是一种所有符号的编码。NrpoJ。NrpoJ。当然是一个很大的集合,现在的规模可以容纳多万个符号。每个符号的编码都不一样,比如,表示阿拉伯字母,表示英语的大写字母,表示汉字“严”。具体的符号对应表,可以查询,或者专门的汉字对应表。1nowf。1nowf。. 的问题需要注意的是,只是一个符号集,只是一种规范、标准,它只规定了符号的二进制代码,却没有规定这个二进制代码应该如何存储在计算机上。fjnFL。fjnFL。比如,汉字“严”的是十六进制数,转换成二进制数足足有位(),也就是说这个符号的表示至少需要个字节。表示其他更大的符号,可能需要个字节或者个字节,甚至更多。tfnNh。tfnNh。这里就有两个严重的问题,第一个问题是,如何才能区别和?计算机怎么知道三个字节表示一个符号,而不是分别表示三个符号呢?第二个问题是,我们已经知道,英文字母只用一个字节表示就够了,如果统一规定,每个符号用三个或四个字节表示,那么每个英文字母前都必然有二到三个字节是,这对于存储来说是极大的浪费,文本文件的大小会因此大出二三倍,这是无法接受的。HbmVN。HbmVN。它们造成的结果是:)出现了的多种存储方式,也就是说有许多种不同的二进制格式,可以用来表示。)在很长一段时间内无法推广,直到互联网的出现。V7l4j。V7l4j。互联网的普及,强烈要求出现一种统一的编码方式。就是在互联网上使用最广的一种的实现方式。其他实现方式还包括和,不过在互联网上基本不用。重复一遍,这里的关系是,是的实现方式之一,它规定了字符如何在计算机中存储、传输等。83lcP。83lcP。最大的一个特点,就是它是一种变长的编码方式。它可以使用个字节表示一个符号,根据不同的符号而变化字节长度。mZkkl。mZkkl。的编码规则很简单,只有二条:)对于单字节的符号,字节的第一位设为,后面位为这个符号的码。因此对于英语字母,编码和码是相同的。)对于字节的符号(),第一个字节的前位都设为,第位设为,后面字节的前两位一律设为。剩下的没有提及的二进制位,全部为这个符号的码。AVktR。AVktR。下表总结了编码规则,字母表示可用编码的位。符号范围编码方式 (十六进制)(二进制) 下面,还是以汉字“严”为例,演示如何实现编码。已知“严”的是(),根据上表,可以发现处在第三行的范围内( ),因此“严”的编码需要三个字节,即格式是“ ”。然后,从“严”的最后一个二进制位开始,依次从后向前填入格式中的,多出的位补。这样就得到了,“严”的编码是“ ”,这是保存在计算机中的实际数据,转换成十六进制就是,转成十六进制的目的为了便于阅读。ORjBn。ORjBn。. 与之间的转换通过上一节的例子,可以看到“严”的码是,编码是,两者是不一样的。它们之间的转换可以通过程序实现。在平台下,有一个最简单的转化方法,就是使用内置的记事本小程序。打开文件后,点击“文件”菜单中的“另存为”命令,会跳出一个对话框,在最底部有一个“编码”的下拉条。2MiJT。2MiJT。里面有四个选项:, 和 。)是默认的编码方式。对于英文文件是编码,对于简体中文文件是编码(只针对简体中文版,如果是繁体中文版会采用码)。gIiSp。gIiSp。)编码指的是编码方式,即直接用两个字节存入字符的码。这个选项用的 格式。) 编码与上一个选项相对应。我在下一节会解释 和 的涵义。)编码,也就是上一节谈到的编码方法。选择完”编码方式“后,点击”保存“按钮,文件的编码方式就立刻转换好了。. 和 上一节已经提到,码可以采用格式直接存储。以汉字”严“为例,码是,需要用两个字节存储,一个字节是,另一个字节是。存储的时候,在前,在后,就是 方式;在前,在后,就是 方式。uEh0U。uEh0U。那么很自然的,就会出现一个问题:计算机怎么知道某一个文件到底采用哪一种方式编码?规范中定义,每一个文件的最前面分别加入一个表示编码顺序的字符,这个字符的名字叫做”零宽度非换行空格“( ),用表示。这正好是两个字节,而且比大。IAg9q。IAg9q。如果一个文本文件的头两个字节是 ,就表示该文件采用大头方式;如果头两个字节是 ,就表示该文件采用小头方式。WwghW。WwghW。. 实例下面,举一个实例。打开”记事本“程序,新建一个文本文件,内容就是一个”严“字,依次采用, 和 编码方式保存。然后,用文本编辑软件中的”十六进制功能“,观察该文件的内部编码方式。):文件的编码就是两个字节“ ”,这正是“严”的编码,这也暗示是采用大头方式存储的。):编码是四个字节“ ”,其中“ ”表明是小头方式存储,真正的编码是。) :编码是四个字节“ ”,其中“ ”表明是大头方式存储。):编码是六个字节“ ”,前三个字节“ ”表示这是编码,后三个“”就是“严”的具体编码,它的存储顺序与编码顺序是一致的。asfps。asfps。.解决的问题:一、如何在中文系统中运行非编码程序?有很多意大利文版(除英文版)学习软件、百科全书等软件在中文系统上会出现乱码,解决方法:内核是编码,支持多语种,对于编码的应用程序会正常显示原文(因为核心是用代码写的,所以不存在问题),但是,很多程序不是用编码写的,这时系统可以指定以特定的编码运行非编码程序,中文版默认的是“简体中文”。你只需在控制面板区域和语言选项高级为非程序的语言选择“意大利语”,即可正确运行意大利文版的游戏程序。分析:我理解的流程是这样:程序意大利语编码(转换表)解释成识别的编码(通过指定的转换表将非 的字符编码转换为同一字符对应的系统内部使用的 编码)被系统翻译成意大利文(因为每个编码对应了相应的意大利文字),便可以正常显示了。ooeyY。ooeyY。三、编码是单字节编码,向下兼容,其编码范围是,之间完全和一致,之间是控制字符,之间是文字符号。收录的字符除收录的字符外,还包括西欧语言、希腊语、泰语、阿拉伯语、希伯来语对应的文字符号。欧元符号出现的比较晚,没有被收录在当中。BkeGu。BkeGu。因为编码范围使用了单字节内的所有空间,在支持的系统中传输和存储其他任何编码的字节流都不会被抛弃。换言之,把其他任何编码的字节流当作编码看待都没有问题。这是个很重要的特性,数据库默认编码是就是利用了这个特性。编码是一个位的容器,编码是一个位的容器。PgdO0。PgdO0。是的别名,有些环境下写作。三、和码是中华人民共和国国家汉字信息交换用编码,全称信息交换用汉字编码字符集基本集,由国家标准总局发布,年月日实施,通行于大陆。新加坡等地也使用此编码。基本集共收入汉字个和非汉字图形字符个,通行于中国大陆。新加坡等地也使用此编码。3cdXw。3cdXw。即汉字内码扩展规范,为扩展的汉语拼音中“扩”字的声母。英文全称 。编码标准兼容,共收录汉字个、符号个,并提供个造字码位,简、繁体字融于一库。h8c52。h8c52。 全称:国家标准信息技术通用多八位编码字符集()第一部分:体系结构与基本多

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论