2

我有一个相当直截了当的问题。当我从流中读取字符串时,所有字母都很好,除了符号。例如,如果我尝试读取其中包含 ™ 或 © 符号的用户名,则这些符号分别打印为:â„¢ 和 ©。我认为 Java 支持所有的 Unicode 字符。如何正确打印符号?

有没有我可以使用的特殊类型的字符串,或者这个问题的另一种解决方案?

4

2 回答 2

2

从流中读取时,例如使用

InputStreamReader reader = new InputStreamReader(stream);

您告诉 java 使用平台编码。这可能不是 Unicode 编码(实际上至少 50% 的时间考虑到 windows pc 出现的频率)

您需要指定字节流的编码,例如

InputStreamReader reader = new InputStreamReader(stream, charset);

或者

InputStreamReader reader = new InputStreamReader(stream, "UTF-8");

如果使用字符集名称而不是字符集实例

于 2012-09-19T00:09:19.850 回答
0

根据您提供的字符示例,我相信您正确阅读字符。例如,版权字符是 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 编码,而第二个看起来是假的。在您的情况下,第一行应该是错误的(在版权符号应该出现的位置显示两个字符),第二行应该显示正确的版权字符。

于 2012-09-19T00:40:23.620 回答