我有一个Web服务接收上传文本文件。所以在服务器端,我得到了一个InputStream对象,并且我尝试将它作为InputStreamReader包装为“UTF8”作为字符集。但是我注意到当我上传一个以US-ASCII编码的文件时也可以工作。看起来Java可以自动将文件从其他所有字符集转换为UTF8。我对吗? charset属性如何工作?java从InputStream创建InputStreamReader对象
回答
没有,Java不一般自动的转换一个字符集到另一个,尤其如果你明确告诉它的字符集来使用。
但是,UTF-8是ASCII兼容的。这意味着每个有效的ASCII码流都自动成为一个有效的UTF-8码流,并且仅包含以UTF-8编码的ASCII码字符的文本也是有效的ASCII码。
因此,如果您打算只接受ASCII和UTF-8输入,那么将其全部视为UTF-8是完全有效的。如果您打算支持其他编码,那么您需要一些方法来传输有关正在使用的实际编码的信息。
这仅适用于US-ASCII是UTF-8的子集(每个ASCII文件也是相同数据的有效UTF-8文件)。
尝试别的东西,它会打破。
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个字符。
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,则会产生垃圾。
为什么?如果您正在上传文件,请使用InputStream。您不希望将文件数据转换为UTF-16,然后再次回到可能的不同编码中。
只需复制字节。
实际上,我必须解析上传的文件,并使用内容(文本)进行一些分析。所以,显然,我需要使用解析文件的正确字符集,对吧? –
- 1. Java:从InputStreamReader中获取InputStream
- 2. InputStream vs InputStreamReader
- 3. Java从inputStream创建图像
- 4. 在java中同时使用InputStream和InputStreamReader
- 5. 从clojure创建Java对象
- 6. 将InputStreamReader转换为InputStream
- 7. 对象创建JAVA
- 8. 如何从InputStream创建RandomAccessFile?
- 9. java创建对象建议
- 10. 从类错误创建新对象Java
- 11. 从对象ArrayList创建JTable - Java
- 12. 从GUI创建一个对象 - Java的
- 13. 从java对象创建xml文件
- 14. Couchbase:如何从java对象创建JsonObject
- 15. InputStream,InputStreamReader和BufferedReader如何在Java中一起工作?
- 16. java中的InputStream和InputStreamReader之间的区别
- 17. 创建从对象
- 18. 创建从对象
- 19. 从InputStreamReader(JAVA)读取多行
- 20. 创建Java对象,扭曲的对象
- 21. Java在对象内创建对象
- 22. Java对象创建错误
- 23. Java创建新对象
- 24. 在java中创建对象
- 25. 创建对象与Java
- 26. 动态创建对象java
- 27. 创建对象的Java中
- 28. Java I/O - 重用InputStream对象
- 29. 从Java中的字体对象创建一个形状对象
- 30. 从给定Class对象创建Java对象
事实上,我有一个UnsupportedEncodingException的** catch **块,我尝试使用UTF-16编码文件。奇怪的是,它不会像预期的那样抛出这个异常。 –
@EnsomHodder:“* UnsupportedEncodingException” - 如果不支持指定的字符集*“ - 如果使用JVM/OS不支持的编码,则会抛出此异常。试试'UTF-42'或'FOO-7' –
是的,我注意到只有当给定的字符集名称不被支持时才抛出异常。 JVM本身不会尝试检测编码模式,但它使用给定的编码字符集来解析文件。这是我的理解。 –