написать текстовый файл, смесь арабского и английского языков

Я пытаюсь написать в текстовом файле предложения, содержащие арабский и английский, но проблема в том, что оба языка имеют направление RTL и LTR, поэтому выходной текстовый файл не сохраняет порядок слов, а некоторые слова идут друг перед другом, что неверно , проблема исправлена, когда я меняю направление текста из блокнота или любого текстового редактора, есть ли способ исправить это с помощью java?


person Mahmoud Ismail    schedule 13.07.2014    source источник


Ответы (3)


Как я объяснил в своем комментарии к вашему предыдущему вопросу, текстовые файлы Unicode хранят символы в логическом порядке. Существует документированный алгоритм обработки двунаправленного текста и управляющих символов, которые можно вставить в текстовый поток, чтобы дать подсказки средству визуализации, например, где поставить знаки препинания, когда у вас есть арабская цитата в середине предложения на английском языке.

Но в конечном итоге выбор «преобладающего» направления текста на верхнем уровне является делом для компонента, отображающего текст, а не для чего-то, что сам текст может контролировать - средство визуализации имеет чтобы решить, имеет ли он дело с абзацем в основном на английском языке, содержащим некоторые фрагменты арабского языка, или наоборот.

Например, предположим, что у меня есть файл, содержащий следующую логическую последовательность символов (в соответствии с соглашениями в спецификации алгоритма двунаправленного текста, я использую строчные буквы для символов с письмом слева направо, таких как английский, и ВЕРХНИЙ регистр для символов с письмом справа налево, например Арабский):

abc def GHI! JKL mno? PQR

Средство просмотра, настроенное на обработку текста как преимущественно LTR, отобразит это как

abc def LKJ !IHG mno? RQP

тогда как средство просмотра, настроенное на обработку его как преимущественно RTL, будет отображать точно такой же текст как

                                      RQP ?mno LKJ !IHG abc def

(при отсутствии управляющих символов наоборот, пунктуация, которая находится на границе между сегментом LTR и RTL, будет прикреплена к тому, который соответствует общему направлению абзаца)

person Ian Roberts    schedule 13.07.2014
comment
спасибо lan за ваше разъяснение, но я все еще не могу решить свою проблему, я попробовал, чтобы выходной текстовый файл был UTF-8 и ansi, чтобы исправить, но проблема все еще существует, редактор, который я использую, - это блокнот или блокнот ++ - person Mahmoud Ismail; 13.07.2014
comment
@MahmoudIsmail Я добавил пример, который может немного прояснить ситуацию. - person Ian Roberts; 13.07.2014
comment
Для обычного текста я не думаю, что в самом тексте есть способ указать зрителю, какое направление использовать. Форматы более высокого уровня содержат внеполосные сигналы, которые вы можете использовать, например <body dir="RTL"> в HTML. - person Ian Roberts; 13.07.2014

Я думаю, вы можете просто установить кодировку в 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());
}
person Hamad AlGhanim    schedule 13.07.2014
comment
Спасибо, Хамад, за ответ, но мою проблему вы можете увидеть в сгенерированном текстовом файле, который вы назвали output.txt, если вы откроете его, вы обнаружите, что порядок слов изменился, а некоторые английские слова сместились, и это точная проблема, с которой я столкнулся. - person Mahmoud Ismail; 13.07.2014

Если вы работаете в Eclipse, щелкните правой кнопкой мыши программу, «Запуск от имени», «Выполнить конфигурацию», «Обычный», «Кодировка», «Наследование по умолчанию UTF-8», просто используйте обычное средство чтения и записи файлов без указания UTF-8 в ваш код.

person Feng Zhang    schedule 10.06.2020