Java me 创建本机位图库

Java me 创建本机位图库,java-me,fonts,bitmap,Java Me,Fonts,Bitmap,我是波斯人,j2me不支持波斯语字体 我将创建一个本机字体库,以获取位图字体并在desplay中绘制波斯文本。但我有个问题 在英语中,每个字母都是一组由形状和未编码组成的字母。像(a,U+0061) 但在波斯语中,字符可能有几种形状。例如,波斯语字母表中的字母“ب”可以是: آب——当它是一个单词中的独立字母时 به——当它是一个单词的起始字母时 如何从字体文件中获取其他形式的字母?您可以使用一个alphabet.png进行直接unicode映射(波斯字符不会因为相邻字符而改变的映射)。如果您

我是波斯人,j2me不支持波斯语字体

我将创建一个本机字体库,以获取位图字体并在desplay中绘制波斯文本。但我有个问题

在英语中,每个字母都是一组由形状和未编码组成的字母。像
(a,U+0061)

但在波斯语中,字符可能有几种形状。例如,波斯语字母表中的字母“ب”可以是:

آب——当它是一个单词中的独立字母时
به——当它是一个单词的起始字母时


如何从字体文件中获取其他形式的字母?

您可以使用一个alphabet.png进行直接unicode映射(波斯字符不会因为相邻字符而改变的映射)。如果您的字符是单间距的,您可以从下面的类开始,如所示:

公共类MonospacedFont{ 私有图像; 私有字符firstChar; 私有国际货币基金组织; 私有整数字符宽度; 公共MonospacedFont(图像、字符firstChar、整数numChars){ if(image==null){ 抛出新的IllegalArgumentException(“image==null”); } //第一个可见的Unicode字符是“!”(值33)
if(firstChar我是一名波斯开发人员,大约4年前我也遇到过同样的问题。你有办法解决这个问题:
1-使用自定义字体
2-在显示文本之前对其进行重塑。
about first中的一篇好文章是“”,但对于阿拉伯语字母,我认为这并不简单。 在第二种方法中,假设你想用正确的字符替换文本中的任何字符。这意味着当你有:

String str = "به";
如果获取str字符,它们将如下所示:
{15761607}这类似于“به”而不是“به”。因此,您需要用正确的Unicode代码替换不正确的Unicode(在本例中,正确的字符是:{65169,65258})。您可以使用“阿拉伯语重塑器”,甚至是为android设计的重塑器!我看到了此重塑器的两个链接:1-2-(我是波斯开发人员,所以我不尝试它们,而是用与它们相同的想法创建类)。
使用一个好的整形器时,你可能会遇到从左到右而不是从右到左排列字符的问题。(一些手机从左到右绘制字符,另一些手机从右到左绘制字符)。我使用下面的类来检测排序是否正确(从右到左):

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;
    }
}    
公共类检测程序{
公共静态布尔hasTrueOrdering()
{
布尔b=假;
试一试{
char[]chArr={6516965258};
String str=新字符串(chArr);
系统输出打印项次(str);
int-width=f1.charWidth(chArr[1])/2;
int height=f1.getHeight();
image1=Image.createImage(宽度、高度);
image2=Image.createImage(宽度、高度);
Graphics g1=image1.getGraphics();
Graphics g2=image2.getGraphics();
g1.抽绳(str,0,0,0);
g2.drawChar(chArr[1],0,0,0);
int[]im1=新int[宽度*高度];
int[]im2=新int[宽度*高度];
image1.getRGB(im1,0,宽度,0,0,宽度,高度);
图像2.getRGB(im2,0,宽度,0,0,宽度,高度);
if(均方射线(im1、im2)){
b=正确;
}否则{
b=假;
}
}捕获(例外e){
e、 printStackTrace();
}
返回b;
}
私有静态布尔值arequalantarray(int[]i1,int[]i2){
如果(i1.length!=i2.length){
返回false;
}否则{
对于(int i=0;i

如果DetectorOrdering.hasTrueOrdering()返回true,确保手机从右到左绘制阿拉伯字符并显示字符串。如果返回false,则从左到右绘制。如果手机从左到右绘制阿拉伯字符,则在重塑字符串后,您需要反转字符串,然后才能显示它。

谢谢您的回答。我有一个问题。所有形状都具有相同的U形吗字母的尼科德代码?@rasoul:例如,字母的每个形状都有一个唯一的代码“ﮓ" Unicode代码是“FB93”,Unicode代码是“FB93”ﮔ是“FB94”如果使用Windows,请使用“字符映射”查看每个字母形状的特殊Unicode代码。
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;
    }
}