Java中,内存的字符表示的是Java的unicode编码?系统中的文件表示的是系统的默认编码?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java中,内存的字符表示的是Java的unicode编码?系统中的文件表示的是系统的默认编码?相关的知识,希望对你有一定的参考价值。

还有,在系统中存在一个utf8编码的文件为什么使用Reader类读入时会使用GBK来转换,而不是使用unicode编码来转换?大神求解

1、Java中,字符在内存中是用unicode编码的

2、系统中的文件默认是用默认编码编码的。解释一下:对于每个语言/区域,比如中文/中国,中文/台湾,英语/美国,英语/英国,系统都指定一个特定的编码方式,当读取或保存文件时,如果不指定要使用何种编码方式或读取时在文件中找不到编码方式的识别码(姑且这么叫吧,作用是帮助识别文件的编码),就会使用这个特定的编码方式,这就叫默认以默认编码方式编码或解码。
如果文件中存在一个utf8编码的文件,Reader类读入它时,为什么要使用GBK来转换呢?因为它笨,它只会使用默认编码来转换,而此系统的默认编码恰好是GBK,如果默认编码是其它的,它也会选择那个对应的默认编码来转换,不要以为Reader类就不犯错。所以,使用Java的io类库时,有时需要自己指定编码,不要以为Java类为你搞定了一切。回头想想,Reader类表现得有点欠佳,这也很正常。毕竟,这世上有那么多的编码方式,Reader类怎么能尽知你的文件使用的是哪一个,即便它都知道,也不可能有能力处理这么多的编码方式啊。所以它不管对错,只认一种——默认编码方式,负责选择正确的编码方式,那是软件开发者和这个文件使用者的责任。追问

Reader类不是负责读入的吗?Java使用unicode编码,那么应该是由系统特定的编码(该文件为utf8)转换为unicode编码吧?怎么会是转换为GBK呢?

追答

Reader是为使用它的客户程序服务的,它要对文件进行解码。要解码就必须知道文件的编码方式,在使用Reader时,如果你不明确指定你的文件的编码方式,Reader假定你的文件是用默认编码方式编码的,因此解码时也用默认编码方式解码。如果你的系统指定的默认编码方式是GBK,自然用它解码。解码后数据就变成了保存到文件以前,它原来的样子,如果原来是用UNICODE编码的,解码后不还是UNICODD编码的吗?
比如,你有一个字符char c='好';在java中它是用UNICODE编码的,然后你将它保存到文件中(以字符形式),并不指定要使用何种编码,那就会使用默认编码对它进行编码,然后保存。当你在默认编码一样的系统上读取这个文件时,如果也不指定编码方式,那使用默认编码方式解码后,不就还原它原来的样子了吗。如果它原来是用unicode编码的,现在还是啊。

参考技术A 这是java语言设计时就规定好了的 参考技术B 是的,默认的。 参考技术C 孤魂野鬼滚滚滚

以上是关于Java中,内存的字符表示的是Java的unicode编码?系统中的文件表示的是系统的默认编码?的主要内容,如果未能解决你的问题,请参考以下文章

java字符编码

java比较容易忘记的知识点

15个易遗忘的java知识点

Java常见关于api面试题

JAVA判断字符串相等

Java 中字两个字符串判断是否相等(转载)