- 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
JAVA字符串编解码问题
JAVA字符串编解码问题
JVM里面的任何字符串资源都是Unicode,就是说,任何String类型的数据都是Unicode编码。没有例外。既然只有一种编码,那么,我们可以这么说,JVM里面的String是不带编码的。String相当于 char[]。 JVM里面的 byte[] 数据是带编码的。比如,Big5,GBK,GB2312,UTF-8之类的。
一个GBK编码的byte[] 转换成 String,其实就是从GBK编码向Unicode编码转换。
一个String转换成一个Big5编码的byte[],其实就是从Unicode编码向Big5编码转换。
所以,Unicode是所有编码转换的中间介质。所有的编码都有一个转换器可以转换到Unicode,而Unicode也可以转换到其他所有的编码。这样构成了一个总线结构。
比如,如果总共有10种编码,那么只需要 10 + 10 20个转换器就够了。如果要是两两直接转换,那么,需要的转换器数量是一个组合数字,需要90个转换器。
1、JVM中单个字符占用的字节长度跟编码方式有关,而默认编码方式又跟平台是一一对应的或说平台决定了默认字符编码方式;
2、对于单个字符:ISO-8859-1单字节编码,GBK双字节编码,UTF-8三字节编码;因此中文平台 中文平台默认字符集编码GBK 下一个中文字符占2个字节,而英文平台 英文平台默认字符集编码Cp1252 类似于ISO-8859-1 。
3、getBytes 、getBytes encoding 函数的作用是使用系统默认或者指定的字符集编码方式,将字符串编码成字节数组。
结论:编码方式决定字节长度;
在中文平台下,默认的字符集编码是GBK,此时如果使用getBytes 或者getBytes GBK ,则按照GBK的编码规则将每个中文字符用2个byte表示。所以我们看到中文最终GBK编码结果就是: -42 -48 -50 -60 。-42和-48代表了中字,而-50和-60则代表了文字。
在中文平台下,如果指定的字符集编码是UTF-8,那么按照UTF-8对中文的编码规则:每个中文用3个字节表示,那么中文这两个字符最终被编码成:-28 -72 -83、-26 -106 -121两组。每3个字节代表一个中文字符。
在中文平台下,如果指定的字符集编码是ISO-8859-1,由于此字符集是单字节编码,所以使用getBytes ISO-8859-1 时,每个字符只取一个字节,每个汉字只取到了一半的字符。另外一半的字节丢失了。由于这一半的字符在字符集中找不到对应的字符,所以默认使用编码63代替,也就是?。
在英文平台下,默认的字符集编码是Cp1252 类似于ISO-8859-1 ,如果使用GBK、UTF-8进行编码,得到的字节数组依然是正确的 GBK4个字节,UTF-8是6个字节 。因为在JVM内部是以Unicode存储字符串的,使用getBytes encoding 会让JVM进行一次Unicode到指定编码之间的转换。对于GBK,JVM依然会转换成4个字节,对于UTF-8,JVM依然会转换成6个字节。但是对于ISO-8859-1,则由于无法转换 2个字节 1个字节,截取了一半的字节 ,所以转换后的结果是错误的。
相同的平台下,同一个中文字符,在不同的编码方式下,得到的是完全不同的字节数组。这些字节数组有可能是正确的 只要该字符集支持中文 ,也可能是完全错误的 该字符集不支持中文 。
记住:
不要轻易地使用或滥用String类的getBytes encoding 方法,更要尽量避免使用getBytes 方法。因为这个方法是平台依赖的,在平台不可预知的情况下完全可能得到不同的结果。如果一定要进行字节编码,则用户要确保encoding的方法就是当初字符串输入时的encoding。
【结论】字节数组转换成字符串,然后转换成字符数组问题:和getBytes encoding 不同,toCharArray 返回的是自然字符。但是这个自然字符的数目和内容却是由原始的编码方式决定的。来看看里面是如何进行字符串的操作的:
String encodedString new String content.getBytes ,
encoding ;char[] charArray inStr.toCharArray ;
可以看到系统首先对原始字符串按照默认的编码方式进行编码,得到一个字节数组,然后按照指定的新的编码方式进行解码,得到新的编码后的字符串。再转换成对应的字符数组。 由于在中文平台下,默认的字符集编码是GBK,于是content.getBytes 得到的是什么呢?就是下面这4个字节:
byte[0] -42 hex stri
文档评论(0)