2012-09-19 53 views
1

我有一个相当直接的问题。当我从流中读取字符串时,除符号外,所有字母都很好。例如,如果我尝试阅读其中包含™或©符号的用户名,则符号分别打印为:?和?。我认为Java支持所有的Unicode字符。我怎样才能让符号被正确地打印出来?Java:替换字符串中缺少的Unicode符号?

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

+1

您需要正确设置流(输入和输出流)的编码。 – nhahtdh

+0

如果输出流使用UTF-8编码,所有应该没问题。这可能是你的输出环境(OS shell,或者其他),这是真正的问题。 – nullpotent

+1

强制性链接:[绝对最低每一个软件开发人员绝对,积极必须知道的关于Unicode和字符集(http://www.joelonsoftware.com/articles/Unicode.html) – leonbloy

回答

2

从流中读取数据时,使用

InputStreamReader reader = new InputStreamReader(stream); 

如你告诉Java使用该平台的编码。这可能不是(事实上的时间至少50%给Windows个人电脑的出现频率)是Unicode编码

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

InputStreamReader reader = new InputStreamReader(stream, charset); 

或者

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

如果使用的字符集的名称,而不是一个字符集的实例

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

+0

,我使用的输出流系统输出流。符号被打印到控制台中。 –

+0

更新了示例以显示使用系统输出流执行此操作。 –