java从InputStream创建InputStreamReader对象

时间:2012-08-30 08:55:49

标签: java character-encoding ascii inputstream inputstreamreader

我有一个Web服务接收上传文本文件。所以在服务器端,我得到了一个 InputStream 对象,我尝试将其包装为 InputStreamReader ,并将“UTF8”作为字符集。但我注意到,当我上传一个用US-ASCII编码的文件时也能正常工作。似乎Java可以自动将文件从所有其他字符集转换为UTF8。我对吗? charset属性如何工作?

5 个答案:

答案 0 :(得分:1)

UTF-8是一套超级US-ASCII

ASCII是7位字符(0到127),它们在US-ASCII和UTF-8以及许多其他字符集中保持不变。大多数字符集不同的是高位字节(128到255)在US-ASCII的情况下它是未定义的,对于ISO-8859-1,这些字符不变,允许字符最多255,在UTF-8中,字符是编码为使用2到4个字节,因此它可以表示最多0x10FFFF或128K字符。

答案 1 :(得分:0)

不,Java通常不会自动将一个字符集转换为另一个字符集,尤其是,如果您明确告诉它使用哪个字符集。

但是,UTF-8与ASCII兼容。这意味着每个有效的ASCII流也自动成为有效的UTF-8流,并且仅包含以UTF-8编码的ASCII字符的文本也是有效的ASCII。

因此,如果您计划仅接受ASCII和UTF-8输入,那么将其全部视为UTF-8完全有效。如果您计划支持其他编码,那么您还需要一些方法来传输有关正在使用的实际编码的信息。

答案 2 :(得分:0)

这只能起作用,因为US-ASCII是UTF-8的子集(每个ASCII文件也是相同数据的有效UTF-8文件)。

尝试别的东西,它会破裂。

答案 3 :(得分:0)

UTF-8与ASCII兼容,即每个ASCII文档也是有效的UTF-8。引用Wikipedia

  

[UTF-8]旨在向后兼容ASCII并避免UTF-16和UTF-32中字节顺序和字节顺序标记的复杂化。

     

[...] Unicode的前128个字符,与ASCII一对一对应,使用具有与ASCII相同的二进制值的单个八位字节进行编码,使有效的ASCII文本有效UTF-8编码的Unicode同样。

因此Java仍将您的流视为UTF-8。如果您尝试使用带有UTF-8阅读器的UTF-16或UTF-32,您将获得垃圾。

答案 4 :(得分:0)

为什么呢?如果您要上传文件,请使用InputStream。您不希望将文件数据转换为UTF-16,然后再将其转换为可能的不同编码。

只需复制字节。