既然java用的是Unicode编码,为什么写的java程序还可以保存为gbk?
是指运行时的编码, 我不知道该怎么描述, 比如 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:
=====
我验证了下,@有明 是对的,在类文件中字符串也是以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
15 回答7.7k 阅读
3 回答7.5k 阅读✓ 已解决
5 回答5.1k 阅读
3 回答5.6k 阅读
2 回答2.6k 阅读✓ 已解决
1 回答3.7k 阅读✓ 已解决
3 回答1.7k 阅读✓ 已解决
Java
字符串在内存中以Unicode
形式存在,再具体一点应该是UTF-16
这种格式。而在源文件和编译文件中,字符串则可以以各种可支持的编码形式存在。简单的说,存在文件中的字符串是多种编码的,在它们被装载到内存时,都转换成了UTF-16
的编码,所以说Java
中字符串是统一编码的,这个统一是指在内存中统一。