3

私はペルシア語ですが、j2meはペルシア語フォントを適切にサポートしていません。

ビットマップフォントを取得し、ペルシア語のテキストをdesplayでペイントするネイティブフォントライブラリを作成します。しかし、私には問題があります。

英語では、各文字は、shapとuncodeで構成されるセットです。好き(a , U+0061)

しかし、ペルシア語では、charはいくつかの形をしている場合があります。たとえば、ペルシア語のアルファベットの文字「ب」は次のようになります。

آب--単語内の別の文字の場合
به--単語内の開始文字の場合
..。

フォントファイルから他の形式の手紙を取得するにはどうすればよいですか?

4

2 に答える 2

2

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

String str = "به";

str文字を取得すると、次のようになります:
{1576,1607}これは「به」ではなく「به」のようになります。したがって、誤ったUnicodeを正しいUnicodeコードに置き換えます(この場合、正しい文字は{65169、 65258})。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-06-02T04:05:54.617 に答える
1

1つのalphabet.pngを直接Unicodeマッピングに使用できます(隣接する文字のためにペルシア文字が変更されないもの)。文字が等幅の場合は、 http://smallandadaptive.blogspot.com.br/2008/12/custom-monospaced-font.htmlにあるように、以下のクラスから始めることができます。

    パブリッククラスMonospacedFont{

    プライベート画像画像;
    プライベート文字firstChar;
    private int numChars;
    private int charWidth;

    public MonospacedFont(画像画像、char firstChar、int numChars){

        if(image == null){
            新しいIllegalArgumentException( "image == null");をスローします。
        }

        //最初に表示されるUnicode文字は'!'です (値33)
        if(firstChar <= 33){
            新しいIllegalArgumentException( "firstChar <= 33");をスローします。
        }

        //画像には少なくとも1文字が必要です
        if(numChars <= 0){
            新しいIllegalArgumentException( "numChars <= 0");をスローします。
        }

        this.image = image;
        this.firstChar = firstChar;
        this.numChars = numChars;
        this.charWidth = image.getWidth()/ this.numChars;
    }

    public void drawString(Graphics g、String text、int x、int y){

        //後で復元するために現在のグラフィッククリップ領域を保存します
        int clipX = g.getClipX();
        int clipY = g.getClipY();
        int clipWidth = g.getClipWidth();
        int clipHeight = g.getClipHeight();
        char [] chars = text.toCharArray();

        for(int i = 0; i <chars.length; i ++){

            int charIndex = chars [i]-this.firstChar;

            //現在の文字が画像に存在します
            if(charIndex> = 0 && charIndex <= this.numChars){
                g.setClip(x、y、this.charWidth、this.image.getHeight());
                g.drawImage(image、x-(charIndex * this.charWidth)、y、
                Graphics.TOP | Graphics.LEFT);
                x + = this.charWidth;
            }
        }

        //最初のクリップ領域を復元します
        g.setClip(clipX、clipY、clipWidth、clipHeight);
    }

}

また、隣接する文字が原因で変更されるペルシア語の文字ごとに異なるchar_uxxxx.pngファイルを使用するように変更します。

文字列を解析するときは、ペイントする前に、どのpngファイルを使用するのが適切かを確認する必要があります。これが開始するのに良い場所であることを願っています。

于 2012-06-01T11:36:05.630 に答える