Java 编写阿拉伯语和英语混合的文本文件

Java 编写阿拉伯语和英语混合的文本文件,java,text,string-parsing,Java,Text,String Parsing,我试着用包含阿拉伯语和英语的文本文件来写句子,但问题是这两种语言都有方向RTL和LTR,所以输出文本文件不保存单词的顺序,有些单词出现在前面,这是错误的,当我从记事本或任何文本编辑器更改文本方向时,问题得到了解决,有没有办法用java解决这个问题?正如我在对上一个问题的评论中所解释的,Unicode文本文件按逻辑顺序存储字符。如何处理双向文本,并控制插入文本流中的字符,以便向渲染器提供提示,例如,当在英语句子的中间有阿拉伯语引语时,在哪里附加标点。 但最终,文本作为一个整体的顶级“主导”方向的选

我试着用包含阿拉伯语和英语的文本文件来写句子,但问题是这两种语言都有方向RTL和LTR,所以输出文本文件不保存单词的顺序,有些单词出现在前面,这是错误的,当我从记事本或任何文本编辑器更改文本方向时,问题得到了解决,有没有办法用java解决这个问题?

正如我在对上一个问题的评论中所解释的,Unicode文本文件按逻辑顺序存储字符。如何处理双向文本,并控制插入文本流中的字符,以便向渲染器提供提示,例如,当在英语句子的中间有阿拉伯语引语时,在哪里附加标点。 但最终,文本作为一个整体的顶级“主导”方向的选择是显示文本的组件的事情,而不是文本本身可以控制的事情——渲染器必须决定它是处理一个主要是英语的段落,其中包含一些阿拉伯文位,还是相反

例如,假设我有一个包含以下字符逻辑序列的文件(根据bidi算法规范中的约定,我对从左到右的字符(如英语)使用小写,对从右到左的字符(如阿拉伯语)使用大写):

配置为将文本视为主要LTR的查看器会将其呈现为

abc def LKJ !IHG mno? RQP
而配置为将其视为主要RTL的查看器将呈现与RTL完全相同的文本


(如果没有相反的控制字符,位于LTR和RTL段之间边界处的标点将附加到与整个段落方向匹配的标点上)

我认为您可以将字符集设置为UTF-8,这样就可以正确地确定单词的顺序。 看看这个

Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("Output.txt"), "UTF-8"));
try {
        out.write("1.");
        out.write("English ");
        out.write("2.");
        out.write("عربي ");
        out.write("3.");
        out.write("Hey ");
        out.write("4.");
        out.write("السلام ");
    } finally {
        out.close();
    }

File f = new File("Output.txt");
Scanner fileprint = new Scanner(f);

while(fileprint.hasNext()){
    System.out.println(fileprint.next());
}

如果您在Eclipse中运行,右键单击您的程序,“运行方式”、“运行配置”、“通用”、“编码”、“默认继承UTF-8”,只需使用常规文件读写器,而不在代码中指定UTF-8。

感谢hamad的回复,但我的问题您可以在生成的文本文件中看到,您称为output.txt。如果打开该文件,您会发现单词顺序发生了变化,一些英语单词发生了变化,我面临的正是这个问题。感谢lan的澄清,但我仍然无法解决我的问题,我尝试将输出文本文件设置为UTF-8和ansi来解决问题,但问题仍然存在,我使用的编辑器是notepad或notepad++@MahmoudeMail,我添加了一个示例,可以更清楚地说明问题。对于纯文本,我认为文本本身没有办法告诉查看者使用哪个方向。更高级别的格式具有可以使用的“带外”信号,例如HTML中的
                                      RQP ?mno LKJ !IHG abc def
Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("Output.txt"), "UTF-8"));
try {
        out.write("1.");
        out.write("English ");
        out.write("2.");
        out.write("عربي ");
        out.write("3.");
        out.write("Hey ");
        out.write("4.");
        out.write("السلام ");
    } finally {
        out.close();
    }

File f = new File("Output.txt");
Scanner fileprint = new Scanner(f);

while(fileprint.hasNext()){
    System.out.println(fileprint.next());
}