[英]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.