2012-12-14 50 views
1

我們可以在帶有ByteStreams的文件中編寫Unicode數據嗎? 我的代碼是:java中的字節流

public static void main(String[] args) throws Exception { 

    String str = "Русский язык "; 
    FileOutputStream fos = new FileOutputStream("file path"); 
    fos.write(str.getBytes()); 
    fos.flush(); 
    fos.close(); 
} 

我在這裏使用一個字節流寫入Unicode數據,但它是寫properly.I是新來的Java,但我已經閱讀了字節流不支持Unicode字符。那麼,爲什麼它在這種情況下工作?

+0

@Andrew先生,從現在起我會保重的。 –

+0

Unicode的東西在'getBytes()'調用中處理,不過你應該真的把它傳遞給像UTF-8這樣的顯式字符集。 –

+0

@Louis Wasserman但是在這裏我沒有提到UTF-8,但它正在服用,以及它的工作方式,我感到困擾? –

回答

3

寫入字符數據我已閱讀,字節流不支持Unicode字符。

要麼你使用了一個不好的信息來源,或者你可能誤解了某些東西。字節流支持字節。因此字節流支持任何可以用字節表示的。視頻,文本,圖片,音樂......如果字節流不支持它,它根本不能在數字計算機中使用。

用簡單的1和0的序列表示這些事物的訣竅是使用約定的規則。您可以根據特定的規則對文本進行編碼,然後接收器可以使用相同的規則將其解碼。

"Русский язык"可以表示爲支持西里爾字符的任何編碼中的字節。在任何unicode的編碼中:UTF-8,UTF-16,UTF-32; Windows-1251,KOI8-R,KOI8-U,ISO-8859-5 ...

這並不意味着這些編碼是相互兼容的。它們在編碼西里爾腳本時都是不兼容的,因此編碼在一個編碼中的文本必須嚴格按照該編碼進行解碼。

.getBytes()使用平臺默認編碼,這恰好是支持西里爾腳本的編碼。你可能會認爲它是UTF-8,但如果你在Windows上,它更可能是Cp1251。不要因爲使用「unicode字符」而陷入陷阱,即您的文件是以UTF編碼進行物理編碼的。這將導致編碼問題。

所以始終明確的編碼,從而使你的程序的工作原理相同的任何平臺上,讓你總是知道什麼編碼的程序創建的文件在你的代碼,你可以這樣做:

String str = "Русский язык "; 
FileOutputStream fos = new FileOutputStream("file path"); 
fos.write(str.getBytes("UTF-8")); 
fos.flush(); 
fos.close(); 

或由對方回答提示:

String str = "Русский язык "; 
OutputStreamWriter osw = new OutputStreamWriter(
     new FileOutputStream("file path"), "UTF-8" 
); 
osw.write(str); 
osw.flush(); 
osw.close(); 

這在技術上是完全一樣的;文本正在根據UTF-8規則轉換爲字節。

+0

這真的是一個很好的答案,appriciate它,如果我使用了一些印地文字符,它會在任何支持西里爾字符的編碼中以字節表示嗎? –

+0

@RiteshKaushik nope,你需要支持梵文字符的編碼。但unicode包括地球上使用的所有字符,所以你用UTF-8 – Esailija

+0

@ Esailija:Thnx for reply pa是安全的,但如果文本是北印度語,並且我沒有在我的代碼中指定任何地方使用UTF-8,它將使用默認編碼是ISO 8859-1在我的情況下,那麼它在這種情況下如何工作,即使我使用「FileOutputStream」將文字文字寫入文本文件(不使用UTF-8),它的寫入是否正確? –

1

通常最好通過與OutputStreamWriter包裝你的OutputStream到作家

Writer out = new OutputStreamWriter(new FileOutputStream("file path"), "UTF-8"));