即使我将编码设置为UTF-8,文件也不会以UTF-8编码保存

时间:2009-10-08 10:58:06

标签: java encoding

当我用Notepad ++检查我的文件时,它是ANSI编码的。我在这里做错了什么?

OutputStreamWriter out = new OutputStreamWriter(new FileOutputStream(file), "UTF8");
try
        {           
            out.write(text);
            out.flush();
        } finally
        {
            out.close();
        }

更新:

现在已经解决了,因为jboss不理解我的xml不是编码,但它是我xml的命名。 Thanx都求救,即使确实没有任何问题......

6 个答案:

答案 0 :(得分:2)

如果您正在创建XML文件(正如您的评论所暗示的那样),我强烈建议您使用XML库输出此编写正确的XML编码头。否则你的字符编码将不符合XML标准,其他工具(如你的JBoss实例)会正确地抱怨。

    // Prepare the DOM document for writing
    Source source = new DOMSource(doc);

    // Prepare the output file
    File file = new File(filename);
    Result result = new StreamResult(file);

    // Write the DOM document to the file
    Transformer xformer = TransformerFactory.newInstance().newTransformer();
    xformer.transform(source, result);

答案 1 :(得分:2)

没有明文这样的东西。问题是应用程序正在解码字符数据,而不会告诉它数据使用哪种编码。

虽然许多Microsoft应用依赖于字节顺序标记的存在来指示Unicode文件,但这绝不是标准的。 The Unicode BOM FAQ says more.

您可以通过在流的开头写入字符'\uFEFF'来将BOM添加到输出中。 More info here。对于依赖BOM的应用程序而言,这应该足够了。

答案 2 :(得分:1)

如果没有BOM(并且Java没有为UTF8输出一个,它甚至不能识别它),只要只使用ASCII范围内的字符,文本在ANSI和UTF8编码中是相同的。因此,Notepad ++无法检测到任何差异。

(而且似乎还有issue with UTF8 in Java ......)

答案 3 :(得分:1)

在通常情况下,UTF-8被设计为与ANSI无法区分。因此,当您将文本写入文件并使用UTF-8对文本进行编码时,在常见情况下,对于打开该文件的任何其他人来说,它看起来都像ANSI。

  • UTF-8对于所有ASCII字符都是每字符1个字节,就像ANSI一样。
  • UTF-8具有与ANSI相同的ASCII字符字节。
  • UTF-8没有任何特殊的标题字符,就像ANSI没有。

只有当你开始进入非ASCII代码点时,情况才开始变得不同。

但在通常情况下,逐字节,ANSI和UTF-8是相同的。

答案 4 :(得分:0)

IANA注册类型为“UTF-8”,而不是“UTF8”。但是,Java应该为无效编码抛出异常,因此可能不是问题。

我怀疑记事本是个问题。使用hexdump程序检查文本,您应该看到它已正确编码。

答案 5 :(得分:0)

您是否尝试在文件开头编写BOM? BOM是唯一可以告诉编辑器文件是UTF-8的东西。否则,UTF-8文件可能看起来像Latin-1或扩展ANSI。

你可以这样做,

public final static byte[] UTF8_BOM = {(byte)0xEF, (byte)0xBB, (byte)0xBF};
...
OutputStream os = new FileOutputStream(file);
os.write(UTF8_BOM);
os.flush();
OutputStreamWriter out = new OutputStreamWriter(os, "UTF8");
try
    {                       
            out.write(text);
            out.flush();
    } finally
    {
            out.close();
    }