繁体   English   中英

Java:替换字符串中缺少的 Unicode 符号?

[英]Java: replace missing Unicode symbols in a string?

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

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

从流中读取时,例如使用

InputStreamReader reader = new InputStreamReader(stream);

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

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

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 编码,而第二个看起来是假的。 在你的情况下,第一行应该是坏的(在版权符号应该出现的地方显示两个字符),第二行应该显示正确的版权字符。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM