0

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

回答

0

没有,Java不一般自动的转换一个字符集到另一个,尤其如果你明确告诉它的字符集来使用。

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

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

0

这仅适用于US-ASCII是UTF-8的子集(每个ASCII文件也是相同数据的有效UTF-8文件)。

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

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个字符。

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,则会产生垃圾。

+0

事实上,我有一个UnsupportedEncodingException的** catch **块,我尝试使用UTF-16编码文件。奇怪的是,它不会像预期的那样抛出这个异常。 –

+0

@EnsomHodder:“* UnsupportedEncodingException” - 如果不支持指定的字符集*“ - 如果使用JVM/OS不支持的编码,则会抛出此异常。试试'UTF-42'或'FOO-7' –

+0

是的,我注意到只有当给定的字符集名称不被支持时才抛出异常。 JVM本身不会尝试检测编码模式,但它使用给定的编码字符集来解析文件。这是我的理解。 –

0

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

只需复制字节。

+0

实际上,我必须解析上传的文件,并使用内容(文本)进行一些分析。所以,显然,我需要使用解析文件的正确字符集,对吧? –