java 字符编码分析和总结.docxVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
String newStr = new String(oldStr.getBytes(), UTF-8); java 中的 String 类是按照 unicode 进行编码的,当使用 String(byte[] bytes, String encoding)构造字符串时,encoding 所指的是 bytes 中的数据是按照那种方式编码的,而不是最后产生的 String 是什么编码方式,换句话说,是让系统把bytes 中的数据由 encoding 编码方式转换成unicode 编码。如果不指明,bytes 的编码方式将由jdk 根据操作系统决定。 当我们从文件中读数据时,最好使用InputStream 方式,然后采用 String(byte[] bytes, String encoding)指明文件的编码方式。不要使用Reader 方式,因为Reader 方式会自动根据jdk 指明的编码方式把文件内容转换成unicode 编码。 当我们从数据库中读文本数据时,采用ResultSet.getBytes()方法取得字节数组, 同样采用带编码方式的字符串构造方法即可。 ResultSet rs; bytep[] bytes = rs.getBytes(); String str = new String(bytes, gb2312); 不要采取下面的步骤。 ResultSet rs; String str = rs.getString(); str = new String(str.getBytes(iso8859-1), gb2312); 这种编码转换方式效率底。之所以这么做的原因是,ResultSet 在getString()方法执行时,默认数据库里的数据编码方式为 iso8859-1。系统会把数据依照iso8859-1 的编码方式转换成 unicode 。使用 str.getBytes(iso8859-1)把数据还原, 然后利用 new String(bytes, gb2312)把数据从 gb2312 转换成unicode,中间多了好多步骤。 从 HttpRequest 中读参数时,利用 reqeust.setCharacterEncoding()方法设置编码方式,读出的内容就是正确的了。 先说 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 个转换器。 一个系统的不同部分,都有自己的编码。比如,数据库,文件,JVM,浏览器这 4 个部分。在这些部分之间数据交换的地方,就会出现编码问题。比如,数据库和JVM 之间,文件和 JVM 之间,浏览器和JVM 之间。这些问题的原理都是相通的。 编码问题最容易处理的地方是文件和JVM 之间。文件 IO API 带有encoding 参数,请自行查阅。 最不容易出现编码问题的地方是数据库和JVM之间。这应该是数据库JDBC 连接的基本功能。本文不专门进行讨论。 最容易出问题的地方是浏览器和服务器JVM 之间(其实,代码里面的字符串更容易出问题, 不过,我已经事先声明,本文不讨论代码中的字符串编码)。下面主要讨论这块浏览器和服务 器 JVM 之间的编码问题。 我们把浏览器编码叫做 Browser_Charset,把 JVM 编码叫做 JVM_Charset(通常等于服务器系统编码)。 当浏览器的数据过来的时候,是一个带有Browser_Charset 的 byte[]。 如果用户处理程序需要一个String 类型的数据,那么 JVM 会好心好意地把这个 byte[]转换成 String。使用的转换器是 JVM_Charset - Unicode。 注意,如果这个时候,Browser_Charset 和 JVM_Charset

文档评论(0)

hao187 + 关注
官方认证
文档贡献者

该用户很懒,什么也没介绍

认证主体武汉豪锦宏商务信息咨询服务有限公司
IP属地上海
统一社会信用代码/组织机构代码
91420100MA4F3KHG8Q

1亿VIP精品文档

相关文档