2012-12-14 43 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"));