Разобраны арабские буквы на польском приложении Samsung J2ME - PullRequest
1 голос
/ 06 марта 2012

Я использую J2ME для разработки приложения на двух устройствах Samsung, приложение поддерживает арабский язык.На Samsung star wifi приложение работает нормально, но на таком устройстве, как samsung GT-S3653, все буквы отображаются в разобранном виде, любая помощь будет высоко оценена. Спасибо

1 Ответ

0 голосов
/ 06 марта 2012

Я говорю на фарси, и у меня была такая же проблема около 4 лет назад. У вас есть способ решить эту проблему:
1- с помощью пользовательских шрифтов .
2- измените текст перед его отображением.
Хорошая статья в первой части - " эмуляция терминала MIDP, часть 3: пользовательские шрифты для MIDP ". Но для арабских букв я думаю, что это не такпросто.
Примерно во втором способе, скажем, вы хотели бы заменить любой символ в вашем тексте на правильный символ. Это означает, что когда у вас есть:

String str = "به";   

Если получить символы str, они будут выглядеть следующим образом:
{1576,1607}, который похож на «ب ه» вместо «به». Поэтому вы должны заменить неправильный Юникод на правильные коды Юникода (в этом случае правильные символы: {65169, 65258}). Вы можете использовать ««Arabic Reshapers» даже преобразователи, разработанные для Android! Я видел 2 ссылки для этого преобразователя: 1- github 2- Арабский Android (я персидский разработчик, и поэтому я не пробую их). При использовании хорошего арабского реформатора у вас могут возникнуть проблемыс расположением символов слева направо, а не справа налево. (некоторые телефоны рисуют символы слева направо, а другие справа налево). Я использую приведенный ниже класс, чтобы определить, является ли порядок истинным (справа налево) или нет:

public class DetectOrdering{   
public static boolean hasTrueOrdering()
{
    boolean b = false;
    try {
        char[] chArr = {65169, 65258};
        String str = new String(chArr);
        System.out.println(str);
        int width = f1.charWidth(chArr[1]) / 2;
        int height = f1.getHeight();
        image1 = Image.createImage(width, height);
        image2 = Image.createImage(width, height);
        Graphics g1 = image1.getGraphics();
        Graphics g2 = image2.getGraphics();
        g1.drawString(str, 0, 0, 0);
        g2.drawChar(chArr[1], 0, 0, 0);
        int[] im1 = new int[width * height];
        int[] im2 = new int[width * height];

        image1.getRGB(im1, 0, width, 0, 0, width, height);
        image2.getRGB(im2, 0, width, 0, 0, width, height);
        if (areEqualIntArrrays(im1, im2)) {
            b = true;
        } else {
            b = false;
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
    return b;
}

private static boolean areEqualIntArrrays(int[] i1, int[] i2) {
    if (i1.length != i2.length) {
        return false;
    } else {
        for (int i = 0; i < i1.length; i++) {
            if (i1[i] != i2[i]) {
                return false;
            }
        }
    }
    return true;
}
}    

Если DetectOrdering.hasTrueOrdering () возвращает true, убедитесь, что телефон рисует арабские символы справа налево и отображает вашу строку. Если возвращается false, он рисует слева направо. Если телефон рисует арабский символ слева направоПравильно, если вы измените строку после ее изменения, вы сможете отобразить ее.

...