Re: [问题] java 执行时的 unicode转换问题

楼主: darkk6 (Mr. Pan)   2015-06-20 14:23:25
※ 引述《tas72732002 (葱头)》之铭言:
: "java在执行的时候所有的字符都是被转成unicode, 包含编译后的.class档案", 请问一下java在读取与写入的时候他的编码是如何转换的?
: 读取部分 :
: 假设这时我使用FileInputStream来读取一个utf-8的档案,
: FileInputStream f = new FileInputStream("d:\test.txt");
: while((length = stream.read(buffer, 0, 1024)) != -1) {
: String str = new String(buffer, 0, length);
: }
: 这时我印出length, 他所显示中文字符是占用了3个byte(length = 3)代表是UTF-8不是unicode, JVM什么时候会将他转成unicode呢? 不是说字符都是unicode处理吗?
: 写入部分 :
: OutputStream os = new FileOutputStream("d:\\one.txt", true);
: String str = "hello world 测试\r\n";
: byte[] buffer = str.getBytes();
: os.write(buffer);
: os.close();
: 这时系统自动产生的档案是UTF-8格式, 网络上说会以作业系统的默认编码的格式, 写入的内容当然也是UTF-8编码, 这部分不太确定~
: 我想请问写入时strm 会先经过JVM将str以 unicode编码 再转成 UTF-8输出吗?
: 如果上面有错误的地方再麻烦各位修正
记得之前我回答过一个类似的文章,参考 #1JCcRGlx
简单来说,这边所谓的 Unicode 指的是 Java 储存在 class 档案中使用的编码方式
当你使用 File I/O Stream 的时候,就和上面这句话无关了。
========================================================
记得:档案在储存的时候都以 binary 的方式看待,也就是说
当有一个 UTF-8 编码的文字档案内容是“好”的时候,要想像
档案内容是 E5 A5 BD 而不是“好”这个字,这才是绝对的内容
========================================================
首先在你第一个例子中,假设这个 test.txt UTF-8 文字档就是这个“好”字,
就代表它的内容是 E5 A5 BD , 3 bytes 你所取出的 length = 3 没有问题
FileInputStream f = new FileInputStream("d:\test.txt");
while((length = stream.read(buffer, 0, 1024)) != -1) {
String str = new String(buffer, 0, length);
}
那么怎样的情况才是这边所提到的 Unicode 呢?
答案是 str 这个变量储存在内存中的时候,采用的是 Unicode 编码
(也就是在 String 中一个名为 value 的 char[] 是采用 unicode 编码,
Java char 的值都会是 Unicode 编码)
接着输出的部分: 为了方便举例我将 str 内容改为 “好”
OutputStream os = new FileOutputStream("d:\\one.txt", true);
String str = "好";
byte[] buffer = str.getBytes();
os.write(buffer);
os.close();
那为什么这边会输出 UTF-8 的文字编码呢? 重点在于 "getBytes()" 这个 method
呼叫 getBytes() 没带任何参数时, Java 会以作业系统(非 JVM)默认的文字编码
进行编码,因此原本在 str 中储存的是 Unicode 编码“好”这个字,在透过
getBytes() 得到的就是 UFT-8(你的系统默认) 的编码,所以才会建立出这个 UTF-8
文字档。
参考:
http://www.docjar.com/docs/api/java/lang/String.html#getBytes
http://www.docjar.com/docs/api/java/lang/StringCoding.html#en
code%28char,%20int,%20int%29
(请自己接起来)
所以这个转换并非在写入 stream 时,而是在你呼叫 getBytes 的时候喔
作者: Killercat (杀人猫™)   2015-06-20 22:38:00
byte[]跟char讲得很清楚 大推这篇
作者: tas72732002 (葱头)   2015-06-21 09:31:00
非常感谢 ~ 很清楚

Links booklink

Contact Us: admin [ a t ] ucptt.com