Я говорю на фарси, и у меня была такая же проблема около 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, он рисует слева направо. Если телефон рисует арабский символ слева направоПравильно, если вы измените строку после ее изменения, вы сможете отобразить ее.