私はペルシャの開発者で、約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を返す場合は、左から右に描画します。電話がアラビア文字を左から右に描画する場合は、形状変更後に文字列を逆にします。それからあなたはそれを表示することができます。