Java OutputStreamWriter构造函数:编码是如何工作的?

Java OutputStreamWriter构造函数:编码是如何工作的?,java,encoding,Java,Encoding,我不是Java开发人员。我只需要了解这个构造函数在做什么: x = new OutputStreamWriter(OutputStream output, "UTF-8") x.write(some string) 我对代码进行了一些简化,希望能突出我的基本问题 文件说: 写入其中的字符使用指定的字符集编码为字节 这是否意味着x中的字符串现在被编码为UTF-8?这能转换吗?如果传递给.write的字符串是ISO-8859-1字符串,则会转换此字符串吗?它怎么知道 这是否意味着x中的字符串现在

我不是Java开发人员。我只需要了解这个构造函数在做什么:

x = new OutputStreamWriter(OutputStream output, "UTF-8") 
x.write(some string)
我对代码进行了一些简化,希望能突出我的基本问题

文件说:

写入其中的字符使用指定的字符集编码为字节

这是否意味着x中的字符串现在被编码为UTF-8?这能转换吗?如果传递给.write的字符串是ISO-8859-1字符串,则会转换此字符串吗?它怎么知道

这是否意味着x中的字符串现在被编码为UTF-8

否。这意味着,当写入程序接收到字符串(通常在UTF-16中有效)时,将使用指定的编码将其编码为字节,然后写入底层的
OutputStream


需要注意的重要一点是,
OutputStream
被要求写入字节,而
Writer
被要求写入文本。编码指定应用于文本数据的转换,以获得二进制数据,基本上是这样。

这与您的问题有什么不同:在java中,字符串在技术上总是UTF-16。在我看来,你可以对它们进行推理,就好像它们没有有效的编码一样;它们是字符串,只有在向字节源写入或从字节源读取它们时,才需要进行编码。@MarkrotVeel:好吧,除非您的BMP之外有字符…@JonSkeet True,这是一个例外,我很难忽略;)谢谢马克·罗特维尔。因为这些问题涉及到两个完全不同的类和方法。正如设计一样,java清楚地分隔了文本,
String/~Writer/~Reader
,它始终使用Unicode,以覆盖所有可能的字符。而
byte[]/~OutputStream/~InputStream
是二进制数据,如果知道所使用的编码,则可能表示文本。字符串=字节[]+编码