无法读取java中的uni-codes字符

时间:2016-11-24 11:59:19

标签: java unicode tinymce

无法读取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编辑器)中键入文本。它可能包含中文,法语和其他语言文本。

تاريخالامتحان

1 个答案:

答案 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传递给它。)