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

實際上,我必須解析上傳的文件,並使用內容(文本)進行一些分析。所以,顯然,我需要使用解析文件的正確字符集,對吧? –