Как соединять арабские буквы в слова - PullRequest
5 голосов
/ 11 сентября 2011

Я должен прочитать арабские буквы из XML-файла и отобразить их как слово

ввод: س ع ا د ة вывод: سعادة выглядит так ..

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

Я также не уверен, что добавил правильные теги, пожалуйста, внесите изменения.

Ответы [ 2 ]

3 голосов
/ 14 сентября 2011

Если вам не поручено написать системный движок рендеринга / разметки на уровне графического интерфейса пользователя, eSniff почти наверняка ответит , а не , что вы хотите сделать.Это объединение арабских букв будет сделано для вас системой управления окнами, как кратко объяснено на странице Википедии .Практически при любых обстоятельствах вам следует избегать использования устаревших арабских форм представления символов.Просто возьмите строку с основными арабскими кодовыми точками Unicode и отправьте их в текстовое поле в вашем пользовательском интерфейсе, и они будут отображены правильно ....

0 голосов
/ 13 сентября 2011

Для ref: http://en.wikipedia.org/wiki/Arabic_alphabet и http://en.wikipedia.org/wiki/Arabic_characters_in_Unicode

Во-первых, я не очень разбираюсь в арабских словоформах, и я просто прочитал в нем документ из Википедии (ссылка выше). Спасибо, что дали мне повод прочитать об этом, но простите, если я полностью испортил это: -) ...

Проблема, похоже, заключается в том, что символ отображается в его правильном "падеже" на основе его положения в слове, верно? Я основываю это на изменениях, которые вы показали в своих примерах. Во всяком случае, по-английски это было бы как прописная буква первой буквы. На арабском языке, по-видимому, есть 4 варианта символов (начальный, средний, конечный и изолированный). Если это правильно, вот пример в C #, который выполняет это отображение:

class ArabicMapper
{ 
    enum CaseMap{End=0, Middle=1, Beginning=2, Isolated=3};
    Dictionary<char, char[]> charMap; // This maps base letters to one of their four cases.
    public ArabicMapper()
    {
        //Create the char map for each letter in the alphabet. {BaseLetter, {End, Middle, Beginning, Isolated}}
        charMap = new Dictionary<char, char[]>();
        charMap.Add(0627, new char[] { FE8D, 0627, 0627, FE8E }); // ʾalif : Not sure of the rules for middle/beginning, so just using the isolated...
        charMap.Add(0628, new char[] { FE90, FE92, FE91, FE8F }); // bāʾ :
        //... and so on for each char ...

    }
    public string charsToWord(char[] word)
    {

        if (word.Length >= 2)
        {
            StringBuilder finalWord = new StringBuilder();

            for(int i=0; i<word.Length; i++)
            {
                if (i == 0)
                    finalWord.Append((charMap[word[i]])[CaseMap.Beginning]);
                else if(i == word.Length-1)
                    finalWord.Append((charMap[word[i]])[CaseMap.End]);
                else
                    finalWord.Append((charMap[word[i]])[CaseMap.Middle]);
            }
            return finalWord.ToString();
        }
        else
        {
            (charMap[word[0]])[CaseMap.Isolated].ToString();
        }
    }
}

P.S. Я не тестировал этот код, поэтому он может не работать. Считайте это псевдокодом, пожалуйста.

...