HTML5技术

从Java String实例来理解ANSI、Unicode、BMP、UTF等编码概念 - 有梦想的咸鱼(4)

字号+ 作者:H5之家 来源:博客园 2016-01-17 14:14 我要评论( )

再具体一点的话,源文件中中国二字的UTF-8编码是 e4 b8 ad e5 9b bd,编译器以GBK方式解码,3个字节对分别查cp936得到3个Unicode值,分别是6d93 e15e 6d57,对应结果图中的三个奇怪字符。如下图所示,编译后这3个Un

  再具体一点的话,源文件中“中国”二字的UTF-8编码是 e4 b8 ad e5 9b bd,编译器以GBK方式解码,3个字节对分别查cp936得到3个Unicode值,分别是6d93 e15e 6d57,对应结果图中的三个奇怪字符。如下图所示,编译后这3个Unicode在.class文件中实际以类UTF-8编码存储,运行的时候,JVM中存储的就是Unicode,然而最终输出时,还是会编码之后传递给终端,这次约定的编码就是系统区域设置的编码,所以如果终端编码设置改了,还是会乱码。我们这里的e15e在Unicode标准中并没有定义相应的字符,所以在不同平台不同字体下显示会有所不同。

image

  可以想象,如果反过来,源文件以GBK编码存储,然后骗编译器说是UTF-8,那基本上是无论输入多少个中文字符都无法编译通过了,因为UTF-8的编码很有规律性,随意组合的字节是不会符合UTF-8编码规则的。

  当然,要使编译器能正确的把编码转换到Unicode,最直接的方法还是老老实实告诉编译器源文件的编码是什么。

四、总结

  经过这次收集整理和实验,了解了很多与编码相关的概念,也熟悉了编码转换的具体过程,这些思想可以推广到各种编程语言去,实现原理都类似,所以我想以后再遇到这类问题,应该不会再不知所以然了。

Reference


https://zh.wikipedia.org/wiki/Unicode

https://zh.wikipedia.org/wiki/UTF-8
https://en.wikipedia.org/wiki/UTF-16
https://en.wikipedia.org/wiki/Java_class_file
https://msdn.microsoft.com/en-us/library/cc194914.aspx

https://zh.wikipedia.org/wiki/%E6%B1%89%E5%AD%97%E5%86%85%E7%A0%81%E6%89%A9%E5%B1%95%E8%A7%84%E8%8C%83

 

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
  • Java 8 Lambda 表达式 - Felix_ICanFixIt

    Java 8 Lambda 表达式 - Felix_ICanFixIt

    2017-04-22 17:04

  • Omi v1.0.2发布 - 正式支持传递javascript表达式 - 【当耐特】

    Omi v1.0.2发布 - 正式支持传递javascript表达式 - 【当耐特】

    2017-03-22 11:03

  • JavaWeb与Asp.net工作原理比较分析 - 社会主义接班人

    JavaWeb与Asp.net工作原理比较分析 - 社会主义接班人

    2017-03-12 14:00

  • 一道面试题引发的对javascript类型转换的思考 - ChokCoco

    一道面试题引发的对javascript类型转换的思考 - ChokCoco

    2017-03-06 17:00

网友点评
>