2011-11-14 19 views
1

我目前正在制作一个程序,将中文单词保存到文本文件中。我在java中创建文本文件,然后尝试向它写入文字。但是,我创建的文本文件从不以UTF-8编码。这是我正在使用的代码,为什么它不起作用?我被告知Java中存在一个固有的错误,但我不知道如何解决它。用Java创建UTF-8文件

public void createFile(String name) { 
    try { 
     BufferedWriter out = new BufferedWriter(new OutputStreamWriter(
     new FileOutputStream(name +".txt"), "UTF-8")); 
     out.write(""); 
    } 
    catch(java.io.IOException e) { 
     System.err.println("Something went wrong."); 
    } 
} 

而且,我有从我仍然可以使用UTF编码的文本文件,一边另一种选择?

另外我通过打开TextEdit应用程序并试图编写中文字符来测试它的编码。这可能是一个问题吗?

+0

您是否尝试使用“utf-8”进行字符编码?你也可以尝试'e.printStackTrace()',这样你就可以更好地了解发生了什么。 – bdares

+0

是的,我试过两个:/ – n00b

+0

那么,堆栈跟踪说什么?是否抛出异常?它究竟如何“不工作”? – bdares

回答

1

首先,文件本身没有编码。他们是一堆0和1。如果你在utf-8中编写“asdf”,它与普通的旧ascii7完全没有区别。如果你写入的是utf-16,那么字节顺序标记(BOM)将是一个非常清楚的指示,它用utf-16编写,即使是空字符串也是如此,但utf-8的确如此不需要这样的标记存在。

因此,你的编辑器无法知道这个文件应该用utf-8编写。您可以通过以下方式将utf-8的BOM写入您的文件:

out.write(0xEFBBBF);

但是,在这种情况下,out必须是OutputStream,例如FileOutputStream。 (但是BufferedWriter和OutputStreamWriter不接受输入字节数组。)

+0

你是完全正确的,谢谢你解决这个问题。得到它的工作! – n00b

0

尝试使用UTF-8而不是UTF8。这可能会解决您的问题。

+0

这两个工作。我在上面发布的代码上试了两次。 –

0

我注意到你没有关闭流:

out.close(); 

你当然不包括,要么写的实际字符的代码...

1

请尝试下面的代码。它为我工作。该文件被写为UTF-8。我可以用Notepad ++打开它,它验证了编码是UTF-8。字符编码正确。我从http://www.khngai.com/chinese/charmap/tbluni.php得到了字符。

 
package testutf8; 

import java.io.FileNotFoundException; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.OutputStreamWriter; 
import java.io.UnsupportedEncodingException; 
import java.io.Writer; 

public class TestUTF8 { 
    public static void main(String[] args) throws FileNotFoundException, UnsupportedEncodingException, IOException { 
    String str = "Unicode Character Map, 0x4E00 - 0x4FFF\n" + 
       "4E00 一 丁 丂 七 丄 丅 丆 万 丈 三 上 下 丌 不 与 丏\n" + 
       "4E10 丐 丑 丒 专 且 丕 世 丗 丘 丙 业 丛 东 丝 丞 丟\n" + 
       "4E20 丠 両 丢 丣 两 严 並 丧 丨 丩 个 丫 丬 中 丮 丯\n" + 
       "4E30 丰 丱 串 丳 临 丵 丶 丷 丸 丹 为 主 丼 丽 举 丿\n" + 
       "4E40 乀 乁 乂 乃 乄 久 乆 乇 么 义 乊 之 乌 乍 乎 乏\n" + 
       "4E50 乐 乑 乒 乓 乔 乕 乖 乗 乘 乙 乚 乛 乜 九 乞 也\n" + 
       "4E60 习 乡 乢 乣 乤 乥 书 乧 乨 乩 乪 乫 乬 乭 乮 乯\n" + 
       "4E70 买 乱 乲 乳 乴 乵 乶 乷 乸 乹 乺 乻 乼 乽 乾 乿\n" + 
       "4E80 亀 亁 亂 亃 亄 亅 了 亇 予 争 亊 事 二 亍 于 亏\n" + 
       "4E90 亐 云 互 亓 五 井 亖 亗 亘 亙 亚 些 亜 亝 亞 亟\n" + 
       "4EA0 亠 亡 亢 亣 交 亥 亦 产 亨 亩 亪 享 京 亭 亮 亯\n" + 
       "4EB0 亰 亱 亲 亳 亴 亵 亶 亷 亸 亹 人 亻 亼 亽 亾 亿\n" + 
       "4EC0 什 仁 仂 仃 仄 仅 仆 仇 仈 仉 今 介 仌 仍 从 仏\n" + 
       "4ED0 仐 仑 仒 仓 仔 仕 他 仗 付 仙 仚 仛 仜 仝 仞 仟\n" + 
       "4EE0 仠 仡 仢 代 令 以 仦 仧 仨 仩 仪 仫 们 仭 仮 仯\n" + 
       "4EF0 仰 仱 仲 仳 仴 仵 件 价 仸 仹 仺 任 仼 份 仾 仿\n" + 
       "4F00 伀 企 伂 伃 伄 伅 伆 伇 伈 伉 伊 伋 伌 伍 伎 伏\n" + 
       "4F10 伐 休 伒 伓 伔 伕 伖 众 优 伙 会 伛 伜 伝 伞 伟\n" + 
       "4F20 传 伡 伢 伣 伤 伥 伦 伧 伨 伩 伪 伫 伬 伭 伮 伯\n" + 
       "4F30 估 伱 伲 伳 伴 伵 伶 伷 伸 伹 伺 伻 似 伽 伾 伿\n" + 
       "4F40 佀 佁 佂 佃 佄 佅 但 佇 佈 佉 佊 佋 佌 位 低 住\n" + 
       "4F50 佐 佑 佒 体 佔 何 佖 佗 佘 余 佚 佛 作 佝 佞 佟\n" + 
       "4F60 你 佡 佢 佣 佤 佥 佦 佧 佨 佩 佪 佫 佬 佭 佮 佯\n" + 
       "4F70 佰 佱 佲 佳 佴 併 佶 佷 佸 佹 佺 佻 佼 佽 佾 使\n" + 
       "4F80 侀 侁 侂 侃 侄 侅 來 侇 侈 侉 侊 例 侌 侍 侎 侏\n" + 
       "4F90 侐 侑 侒 侓 侔 侕 侖 侗 侘 侙 侚 供 侜 依 侞 侟\n" + 
       "4FA0 侠 価 侢 侣 侤 侥 侦 侧 侨 侩 侪 侫 侬 侭 侮 侯\n" + 
       "4FB0 侰 侱 侲 侳 侴 侵 侶 侷 侸 侹 侺 侻 侼 侽 侾 便\n" + 
       "4FC0 俀 俁 係 促 俄 俅 俆 俇 俈 俉 俊 俋 俌 俍 俎 俏\n" + 
       "4FD0 俐 俑 俒 俓 俔 俕 俖 俗 俘 俙 俚 俛 俜 保 俞 俟\n" + 
       "4FE0 俠 信 俢 俣 俤 俥 俦 俧 俨 俩 俪 俫 俬 俭 修 俯\n" + 
       "4FF0 俰 俱 俲 俳 俴 俵 俶 俷 俸 俹 俺 俻 俼 俽 俾 俿\n"; 

    FileOutputStream fos = new FileOutputStream("tmp.txt"); 
    Writer   out = new OutputStreamWriter(fos, "UTF-8"); 
    out.write(str); 
    out.close(); 
    } 
} 

1

这可能是一个TextEdit使用问题。

如果您正在编写的文件中没有非ASCII字符,则TextEdit确定编码的算法可能会落在ASCII或Latin-1变体上。

您可以在文件 - >打开对话框中指定文本文件的编码。我不确定TextEdit是否会记住将来双击此文件的决定。

+0

是的,谢谢你帮我澄清。我没有意识到如何编码文件以及BOM和内容。这是这里的问题。 – n00b