无法读取java中的uni-codes字符。
String inputLine = "تاريخالامتحان"
当我尝试使用
将此行写入文本文件时 String tmp = new String(inputLine.getBytes(), Charset.forName("UTF-8"));
File file = new File("/home/gaurav/input.txt");
// if file doesnt exists, then create it
if (!file.exists()) {
file.createNewFile();
}
FileWriter fw = new FileWriter(file.getAbsoluteFile());
BufferedWriter bw = new BufferedWriter(fw);
bw.write(content);
bw.close();
文本文件仍包含相同的文本。
注意: 输入行内容由浏览器提交,而我在支持多语言文本的文本框(Tinymc编辑器)中键入文本。它可能包含中文,法语和其他语言文本。
تاريخالامتحان
答案 0 :(得分:1)
String inputLine = "ت...
这是HTML或XML数字字符引用。它仅表示HTML或XML文档中的ت
。在其他任何地方,&符没有神奇的力量,它只是一个&符号,一个哈希符号,数字1578和一个分号。
您已在Java字符串文字中使用它。 Java不是HTML。您正在将结果写入文本文件。纯文本也不是HTML。因此,“&”符号在任何时候都没有任何特殊含义。
Java有自己的方法从数字中引用一个字符,即反斜杠-U转义。你想要字符ت
,U + 062A阿拉伯字母Teh,格式为:
String inputLine = "\u062A...
(十六进制0x062A =十进制1578。)
在您的字符串中加入阿拉伯语后,您现在必须将其放入文件中。要做到这一点,你必须选择文件的编码方式。你可能想要UTF-8,尽管还有其他可能的编码可以容纳阿拉伯字符。不幸的是...
FileWriter fw = new FileWriter(file.getAbsoluteFile());
... JAVA有一堆定义不明确的接口,允许你不选择编码,而是选择'默认编码'。这种编码因机器而异,几乎不是你想要的任何东西;机会在你的机器上根本不能包含阿拉伯字符。
你永远不应该在Java中使用默认编码,这就是为什么Java的界面和教程鼓励你一直使用它是如此不幸。 FileWriter
类是最糟糕的,因为仅允许您使用讨厌的默认编码。所以永远不要使用FileWriter
,这只是OutputStreamWriter
的{{1}}的蹩脚捷径。使用FileOutputStream
,您可以选择您真正想要的编码。
OutputStreamWriter
顺便说一句,你不应该这样做:
OutputStreamWriter fw = new OutputStreamWriter(new FileOutputStream(file), "utf-8");
这将使用默认编码将String tmp = new String(inputLine.getBytes(), Charset.forName("UTF-8"));
编码为字节,然后使用UTF-8将结果字节解码回字符串。如果原始字符串被严重错误解码,那只会做任何有用的事情,即便如此,它也不是你应该依赖的东西,因为它取决于可怕的不可靠的默认编码。不要陷入使用粘贴的编码/解码周期来编写代码的迷信。更好的方法是首先让角色正确。
您可能也不需要inputLine
位。 createNewFile
已经开始在新文件的开头写入(除非您将FileOutputStream
传递给它。)