无法使用UTF8 / UTF16编码在Excel中编写多字节字符

时间:2012-11-21 04:30:53

标签: java character-encoding

我一直在尝试使用

将简体中文字符写入excel文件
OutputStreamWriter(OutputStream out, String charsetName).write(String str,int off,int len);

OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream(file), "UTF-16");
osw.write((vt.get(index)).toString());

但不幸的是,这不起作用。它显示垃圾字符。有没有人对此有任何想法。

这是excel的问题还是我可以在我的代码中纠正这个问题。

1 个答案:

答案 0 :(得分:2)

我的Excel版本遇到了中文问题所以我决定选择俄罗斯人。西里尔语远远超过了Unicode,如果你可以让它工作,你应该能够让中文工作。

你的代码很接近,但有两件事是错的:

UTF-16可以是big-endian或little endian。 Java字符集名称“UTF-16”实际上意味着UTF-16具有大端编码。 Microsoft始终使用little-endian作为默认值。你需要使用charset“UTF-16LE”

您需要通过在文件开头放置byte order mark (BOM)来警告Excel您正在使用此编码。它只是两个字节0xFF,后跟0xFE。

这是一个简单的程序,用俄语打印“战争与和平”,每个单词都在一个单独的列中。生成的文件可以导入Excel。只需用您的中文文本替换俄语文本。

import java.io.FileOutputStream;
import java.io.OutputStreamWriter;

public class Russian
{
   public static void main(String [] args) throws Exception
   {
      byte [] bom = { (byte) 0xFF, (byte) 0xFE};
      String text = "ВОЙНА,И,МИР";
      FileOutputStream fout = new FileOutputStream("WarAndPeace.csv");
      fout.write(bom);
      OutputStreamWriter out = new OutputStreamWriter(fout, "UTF-16LE");
      out.write(text);
      out.close();;
   }
}