扫码关注官方订阅号
既然java用的是Unicode编码,为什么写的java程序还可以保存为gbk?
业精于勤,荒于嬉;行成于思,毁于随。
Java字符串在内存中以Unicode形式存在,再具体一点应该是UTF-16这种格式。而在源文件和编译文件中,字符串则可以以各种可支持的编码形式存在。简单的说,存在文件中的字符串是多种编码的,在它们被装载到内存时,都转换成了UTF-16的编码,所以说Java中字符串是统一编码的,这个统一是指在内存中统一。
Java
Unicode
UTF-16
是指运行时的编码, 我不知道该怎么描述, 比如 String str="abc" ; 这个"abc"就是unicode编码, 至于你的java文件保存成utf-8或者gbk这个没有影响.
赞同有明的回答 补充一下:
*.java (utf-8/gbk/...) -> *.class (utf-8) -> memory (utf-16)
javac 编译中有参数可以制定源代码的编码 -encoding <encoding> Specify character encoding used by source files 所以源码用其他编码都是可以的,最常见的是使用UTF-8.
-encoding <encoding> Specify character encoding used by source files
See also:
java class file
java language spec
=====我验证了下,@有明 是对的,在类文件中字符串也是以utf-8保存的,我想当然了,真是抱歉
public class Hello { public static void main(String[] args){ System.out.println("你好,中国"); } }
编译后的二进制文件
00000000: cafe babe 0000 0034 001d 0a00 0600 0f09 .......4........ 00000010: 0010 0011 0800 120a 0013 0014 0700 1507 ................ 00000020: 0016 0100 063c 696e 6974 3e01 0003 2829 .....<init>...() 00000030: 5601 0004 436f 6465 0100 0f4c 696e 654e V...Code...LineN 00000040: 756d 6265 7254 6162 6c65 0100 046d 6169 umberTable...mai 00000050: 6e01 0016 285b 4c6a 6176 612f 6c61 6e67 n...([Ljava/lang 00000060: 2f53 7472 696e 673b 2956 0100 0a53 6f75 /String;)V...Sou 00000070: 7263 6546 696c 6501 000a 4865 6c6c 6f2e rceFile...Hello. 00000080: 6a61 7661 0c00 0700 0807 0017 0c00 1800 java............ 00000090: 1901 000f e4bd a0e5 a5bd efbc 8ce4 b8ad ................ 000000a0: e59b bd07 001a 0c00 1b00 1c01 0005 4865 ..............He 000000b0: 6c6c 6f01 0010 6a61 7661 2f6c 616e 672f llo...java/lang/ 000000c0: 4f62 6a65 6374 0100 106a 6176 612f 6c61 Object...java/la 000000d0: 6e67 2f53 7973 7465 6d01 0003 6f75 7401 ng/System...out. 000000e0: 0015 4c6a 6176 612f 696f 2f50 7269 6e74 ..Ljava/io/Print 000000f0: 5374 7265 616d 3b01 0013 6a61 7661 2f69 Stream;...java/i 00000100: 6f2f 5072 696e 7453 7472 6561 6d01 0007 o/PrintStream... 00000110: 7072 696e 746c 6e01 0015 284c 6a61 7661 println...(Ljava 00000120: 2f6c 616e 672f 5374 7269 6e67 3b29 5600 /lang/String;)V. 00000130: 2100 0500 0600 0000 0000 0200 0100 0700 !............... 00000140: 0800 0100 0900 0000 1d00 0100 0100 0000 ................ 00000150: 052a b700 01b1 0000 0001 000a 0000 0006 .*.............. 00000160: 0001 0000 0001 0009 000b 000c 0001 0009 ................ 00000170: 0000 0025 0002 0001 0000 0009 b200 0212 ...%............ 00000180: 03b6 0004 b100 0000 0100 0a00 0000 0a00 ................ 00000190: 0200 0000 0400 0800 0500 0100 0d00 0000 ................ 000001a0: 0200 0e ...
其中"你好,中国" 的utf-8 编码是0xe4 0xbd 0xa0 0xe5 0xa5 0xbd 0xef 0xbc 0x8c 0xe4 0xb8 0xad 0xe5 0x9b 0xbd
0xe4 0xbd 0xa0 0xe5 0xa5 0xbd 0xef 0xbc 0x8c 0xe4 0xb8 0xad 0xe5 0x9b 0xbd
微信扫码关注PHP中文网服务号
QQ扫码加入技术交流群
Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
PHP学习
技术支持
返回顶部
Java字符串在内存中以Unicode形式存在,再具体一点应该是UTF-16这种格式。而在源文件和编译文件中,字符串则可以以各种可支持的编码形式存在。简单的说,存在文件中的字符串是多种编码的,在它们被装载到内存时,都转换成了UTF-16的编码,所以说Java中字符串是统一编码的,这个统一是指在内存中统一。是指运行时的编码, 我不知道该怎么描述, 比如 String str="abc" ; 这个"abc"就是unicode编码, 至于你的java文件保存成utf-8或者gbk这个没有影响.
赞同有明的回答 补充一下:
*.java (utf-8/gbk/...) -> *.class (utf-8) -> memory (utf-16)
javac 编译中有参数可以制定源代码的编码
-encoding <encoding> Specify character encoding used by source files所以源码用其他编码都是可以的,最常见的是使用UTF-8.See also:
java class file
java language spec
=====
我验证了下,@有明 是对的,在类文件中字符串也是以utf-8保存的,我想当然了,真是抱歉
编译后的二进制文件
其中"你好,中国" 的utf-8 编码是
0xe4 0xbd 0xa0 0xe5 0xa5 0xbd 0xef 0xbc 0x8c 0xe4 0xb8 0xad 0xe5 0x9b 0xbd