环境:Ubuntu12.04,Open JDK7u3(java1.7.0_03)完全相同的程序和文件,在windows下面运行正常,到ubuntu下面运行异常:读取UTF-8文件,中文全部显示问号。可以保证文件编码确实是UTF-8,加BOM头和无BOM头都试过,一样的乱码。
代码里用juniversalchardet检测文件编码了,也检测是UTF-8。读取文本确实是用UTF-8读取的,代码如下:
String configContent;
InputStream fis = getClass().getClassLoader().getResourceAsStream(xmlFile);
try{
log.debug("Reading file " + xmlFile + " using " + charset);
InputStreamReader reader = new InputStreamReader(fis, charset);
try{
StringWriter writer = new StringWriter();
char[] buff = new char[1024];
int len;
while((len = reader.read(buff)) > 0){
writer.write(buff, 0, len);
}
configContent = writer.toString();
}finally{
reader.close();
}
}finally{
fis.close();
}谁能解决,再加200分都行。

解决方案 »

  1.   


    [2012-08-09 23:16] [DEBUG] com.xmlswitch.parser.XmlParser.loadDocumentElement(XmlParser.java:45)  Detected encoding of config dataconfig.xml: UTF-8
    [2012-08-09 23:16] [DEBUG] com.xmlswitch.parser.XmlParser.loadDocumentElement(XmlParser.java:55)  Reading file dataconfig.xml using UTF-8
    [2012-08-09 23:16] [DEBUG] com.xmlswitch.parser.XmlParser.loadDocumentElement(XmlParser.java:77)  Loaded config file:<?xml version="1.0" encoding="UTF-8"?>
    <root>
    <!-- ???????? Column?????? D???????? U????????? -->
    每个问号其实是一个汉字。
      

  2.   

    其实这只是一个表面现象,你可以Debug看一下你读到的数据,可能就是中文,
    如果这样,检查看你的log4j的输出编码log4j.appender.console.encoding=UTF-8灰色部门是自定义的
      

  3.   


    灰色部门是指 console
      

  4.   

    你是把结果输出到文件吗?
    输出的时候有没有指定编码格式?
    看看System.out.println(System.getProperty("file.encoding"));输出什么?
    用下面的输出看看呢?
    PrintWriter writerUTF = new PrintWriter(new OutputStreamWriter(
    new FileOutputStream("UTF8.txt"), "UTF8"));
    writerUTF.println("Write file using UTF8");
    writerUTF.println();
    writerUTF.println(configContent);
    writerUTF.close();
      

  5.   

    我猜测有2个原因
    1 你的控制台,也就是屏幕的编码不支持UTF-8, 也就是虽然程序处理和输出都是正确的,但你屏幕显示错了。
    2 那个文件不是UTF-8, 你换个文件看看
      

  6.   

    谢谢大家关注!TO trocp:谢谢,
    直接log输出中文,是可以正常输出的,查看log文件中文正常,应该说明log配置没有问题。代码如下:
    log.debug("这里是中文");TO fw0124:谢谢,
    System.getProperty("file.encoding")输出为UTF-8。TO java2000_net:谢谢,
    没有注意过控制台输出。log文件时乱码,带中文的SQL数据库查询无结果(正常来讲是可以查出数据的)。
    那个文件一定是UTF-8的,使用编码工具查看过了,在windows下执行的时候读取正常,在代码里也用juniversalchardet检测了,都一致。补充:写UTF-8文件中文都是正常的,就是读取时不正常,每个中文都显示成一个问号。
      

  7.   

    可能是Ubuntu 下文本编辑器打开中文的问题,程序生成的可能没有问题。
    Ubuntu 文本编辑器 检测文件的编码可能不包括 GB-18030、GB-2312 等常见中文编码安装 leafpad、KWrite 等支持自动检测中文编码的文本编辑器。
      

  8.   

    TO brightyq:谢谢,
    没在Ubuntu上打开过,生成的log文件都是通过ftp下载下来在windows上面打开看的。
      

  9.   


    我也觉得是1
    lz把你生成的文件传到win上看看
    还乱码不
      

  10.   

    相同的程序和文件,放到windows下执行完全正常,放到linux下面读到就是乱码。
    我保证文件编码没错,绝对保证。
      

  11.   

    TO brightyq:
    客户的系统是英文版。
      

  12.   

    终于好了。客户的两台服务器,其中一台客户自己安装中文,就莫名其妙搞好了,另外一台file.encoding不是UTF-8,启动的时候加参数设置成UTF-8就好了。谢谢大家。我以前一直以为用UTF-8的源码编译出来的程序,程序内的编码也会是UTF-8呢,原来有的时候并不是。