字节顺序标记读取UTF-8 csv和excel文件

时间:2013-12-10 18:15:05

标签: java excel utf-8

我必须使用BOM(字节顺序标记)来确保以UTF-8格式正确显示cvs和excel中的下载文件。

**

  

我的问题是可以将BOM应用于FileOutputStream而不是   OutputStream如下所示?

**

    String targetfileName = reportXMLFileName.substring(0, reportXMLFileName.lastIndexOf(".") + 1);
      targetfileName += "xlsx";
     File tmpFile=new File((filePath !=null?filePath.trim():"")+"/"+templateFile);
     FileOutputStream out = new FileOutputStream((filePath !=null?filePath.trim():"")+"/"+targetfileName);

/* Here is the example*/
  out.write(new byte[] {(byte)0xEF, (byte)0xBB, (byte)0xBF });
  substitute(tmpFile, tmp, sheetRef.substring(1), out);
                    out.close();

2 个答案:

答案 0 :(得分:1)

是。 BOM位于任何数据流的开头,无论是通过网络还是通过文件。只需以相同的方式将BOM写入文件的开头,只需FileOutputStream即可。无论如何,请记住FileOutputStream 一种OutputStream。

答案 1 :(得分:1)

(正如评论中所述。)

以下file可能是文件,(文件)OutputStream或String(文件名)。

final String ENCODING = "UTF-8";
PrintWriter out = new PrintWriter(file, ENCODING))));
try {
    out.print("\ufffe"); // Write the BOM
    out.println("<?xml version=\"1.0\" encoding=\"" + ENCODING + "\"?>");
    ...
} finally {
    out.close();
}

或者从Java 7开始:

try (PrintWriter out = new PrintWriter(f, ENCODING))))) {
    out.print("\ufffe"); // Write the BOM
    out.println("<?xml version=\"1.0\" encoding=\"" + ENCODING + "\"?>");
    ...
}

使用文本,使用Writer更自然,因为不需要自己用String.getBytes("UTF-8")转换字符串。