1

J2ME ポリッシュを使用して、2 つのサムスン デバイスでアプリを開発しています。アプリはアラビア語をサポートしています。Samsung star wifi では、アプリは正常に動作しますが、samsung GT-S3653 のようなデバイスでは、すべての文字が分解されて表示されます。

4

1 に答える 1

0

私はファルシ語を話し、約 4 年前に同じ問題を抱えていました。この問題を解決する方法がいくつかあります。1-カスタム フォントを使用し
ます。 2-表示する前にテキストの形状を変更します。 最初の良い記事は、「MIDP ターミナル エミュレーション、パート 3: MIDP のカスタム フォント」ですが、アラビア文字については簡単ではないと思います。 ほぼ 2 番目の方法で、テキスト内の任意の文字を正しい文字に置き換えるとします。これは、次の場合を意味します。


String str = "به";   

str 文字を取得すると、次のようになります:
{1576,1607} これは、"بک" ではなく "ب æ" のようなものです。したがって、正しくない Unicode を正しい Unicode コードに置き換える必要があります (この場合、正しい文字は: {65169, 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 を返す場合、左から右に描画します。携帯電話がアラビア文字を左から右に描画する場合、再形成後に文字列を逆にしますそれを表示することができます。

于 2012-03-06T13:38:20.383 に答える