Java 什么';s InputStreamReader返回的文本字符集(InputStream in,字符集cs)

Java 什么';s InputStreamReader返回的文本字符集(InputStream in,字符集cs),java,character-encoding,inputstreamreader,Java,Character Encoding,Inputstreamreader,我通过以下方式读取UTF-8文件: br = new BufferedReader(new InputStreamReader(new FileInputStream(filePath), Charset.forName("UTF-8"))); 我想知道调用br.readLine()后返回的字符串的字符集是什么 我的计算机上的Eclipse使用“GBK”作为默认字符集。从技术上讲,文件是使用UTF-8字符集读取的,正如您告诉InputStreamReader那样。文件内容的底层字节使用UTF-

我通过以下方式读取UTF-8文件:

br = new BufferedReader(new InputStreamReader(new FileInputStream(filePath), Charset.forName("UTF-8")));
我想知道调用
br.readLine()
后返回的
字符串的字符集是什么


我的计算机上的Eclipse使用“GBK”作为默认字符集。

从技术上讲,文件是使用UTF-8字符集读取的,正如您告诉
InputStreamReader那样。文件内容的底层字节使用UTF-8进行解释。
readLine()
方法返回一个
String
,该字符串将字符存储在Java自己的UTF-16字符集内部

之后会发生什么完全取决于您使用此
字符串所做的操作。如果使用
编写器将其写回文件,而不指定字符集,则将使用平台的默认值。如果要将其显示给stdout,则将使用stdout的默认字符集,该字符集取决于运行时环境(命令控制台?IDE?等)。如果要将其保存在数据库中,则它取决于JDBC驱动程序配置和/或DB表编码。等等


显然,您正在通过
System.out.println()
将其打印到Eclipse控制台中的stdout。在这种情况下,GBK字符集将用于显示字符。这将使GBK未涵盖的任何最初读取的UTF-8字符格式错误。您需要将Eclipse配置为使用UTF-8作为文本文件编码。这可以通过窗口>首选项>常规>工作区>文本文件编码来完成。

从技术上讲,文件是使用UTF-8字符集读取的,正如您告诉
InputStreamReader
的那样。文件内容的底层字节使用UTF-8进行解释。
readLine()
方法返回一个
String
,该字符串将字符存储在Java自己的UTF-16字符集内部

之后会发生什么完全取决于您使用此
字符串所做的操作。如果使用
编写器将其写回文件,而不指定字符集,则将使用平台的默认值。如果要将其显示给stdout,则将使用stdout的默认字符集,该字符集取决于运行时环境(命令控制台?IDE?等)。如果要将其保存在数据库中,则它取决于JDBC驱动程序配置和/或DB表编码。等等


显然,您正在通过
System.out.println()
将其打印到Eclipse控制台中的stdout。在这种情况下,GBK字符集将用于显示字符。这将使GBK未涵盖的任何最初读取的UTF-8字符格式错误。您需要将Eclipse配置为使用UTF-8作为文本文件编码。这可以通过窗口>首选项>常规>工作区>文本文件编码来完成。

它表示为16位Unicode的Java字符。

它表示为16位Unicode的Java字符。

Java中的所有字符串都是。在中读取字符时,将使用指定的编码将其转换为UTF-16。当您写出它们时,您将选择另一种编码来写入,隐式或显式,字符将从UTF-16转换为您选择的任何字符。

Java中的所有字符串都是。在中读取字符时,将使用指定的编码将其转换为UTF-16。当您写出这些字符时,您将选择另一种编码(隐式或显式)将其写入,字符将从UTF-16转换为您选择的任何字符。

为什么要问这个问题?您在阅读或显示已读字符时有问题吗?为什么要问这个问题?您在读取或显示读取的字符时有问题吗?请记住,UTF-8在存储所有Unicode时没有问题,因此一个UTF-8字符可能是两个16位的“字符单元”。java
char
不能包含Unicode字符。它需要一个字符串,带有难看的代理和所有字符。记住,UTF-8存储所有Unicode是没有问题的,因此一个UTF-8字符可能是两个16位的“字符单元”。java
char
不能包含Unicode字符。它需要一个字符串,包含丑陋的代理和所有内容。