我有一個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本身不會嘗試檢測編碼模式,但它使用給定的編碼字符集來解析文件。這是我的理解。 –