我有一个相当直截了当的问题。当我从流中读取字符串时,所有字母都很好,除了符号。例如,如果我尝试读取其中包含 ™ 或 © 符号的用户名,则这些符号分别打印为:â„¢ 和 ©。我认为 Java 支持所有的 Unicode 字符。如何正确打印符号?
有没有我可以使用的特殊类型的字符串,或者这个问题的另一种解决方案?
从流中读取时,例如使用
InputStreamReader reader = new InputStreamReader(stream);
您告诉 java 使用平台编码。这可能不是 Unicode 编码(实际上至少 50% 的时间考虑到 windows pc 出现的频率)
您需要指定字节流的编码,例如
InputStreamReader reader = new InputStreamReader(stream, charset);
或者
InputStreamReader reader = new InputStreamReader(stream, "UTF-8");
如果使用字符集名称而不是字符集实例
根据您提供的字符示例,我相信您正确阅读字符。例如,版权字符是 Unicode A9。但是,当您以 UTF-8 将其写出时,它将被序列化为 2 个字节:C2 后跟 A9。见http://www.fileformat.info/info/unicode/char/a9/index.htm
如果您的输出设备需要 UTF-8 格式的数据,一切都会好起来的。但是,由于您看到 ©,我相信您的输出设备需要 ISO-8859-1 中的数据(请参阅http://en.wikipedia.org/wiki/ISO/IEC_8859-1),因此您的数据不匹配。输出设备将 C2 解释为 Â,将 A9 解释为 ©。
要在代码中解决此问题(不更改输出设备),您需要创建一个打印流,在将 Unicode 字符转换为字节流时使用 ISO-8859-1 字符编码。例如:
public static void main (String [] args) throws Exception
{
// use default character encoding
String s = "copyright is ©";
System.out.println(s);
// create a new stream with a different encoding
PrintStream out = new PrintStream(System.out, true, "ISO-8859-1");
out.println(s);
}
在我的情况下,第一个 println 看起来不错,因为 IDE 控制台窗口具有 UTF-8 编码,而第二个看起来是假的。在您的情况下,第一行应该是错误的(在版权符号应该出现的位置显示两个字符),第二行应该显示正确的版权字符。