2009-12-18 21 views
0

我想在BlackBerry设备的j2me应用程序中将一些阿拉伯文本显示到LabelField中。 假设设备上安装了阿拉伯字体。BlackBerry - Unicode文本显示

在本地化资源中,如果使用阿拉伯语语言环境,则所有文本都以Unicode序列保存。但是事件,如果我使用这种格式明确,还设置阿拉伯语的语言环境,它不工作:

Locale.setDefault(Locale.get(Locale.LOCALE_ar, null)); 
    add(new LabelField("\u0627\u0644\u0639\u0631\u0628\u064A\u0629")); 

请咨询:

  • 在什么样的格式或代码页,我要救阿拉伯文字?
  • 如何使用安装的阿拉伯字体在标签中显示阿拉伯文字?

谢谢!

回答

3

解决办法是传递Unicode序列的字符数组:

char[] text = new char[] {'\u0627', '\u0644', '\u0639', 
    '\u0631', '\u0628', '\u064A', '\u0629'}; 
add(new LabelField(text)); 

因此,为了显示Unicode序列保存在字符串,我们需要把这个字符串解析成字符:

private char[] getUnicodeChars(String string) { 
    char[] result = new char[] {}; 
    String[] charCodes = split(string, "\\"); 
    result = new char[charCodes.length]; 
    for (int i = 0; i < charCodes.length; i++) { 
     result[i] = (char) Integer.parseInt(charCodes[i].substring(1), 16); 
    } 
    return result; 
} 

而且某处代码:

String txt = "\u0627\u0644\u0639\u0631\u0628\u064A\u0629"; 
add(new LabelField(getUnicodeChars(txt))); 

而且没有必要切换区域设置。当然应该安装阿拉伯字体。

+0

解析字符串文字时,Java编译器将\ uNNNN识别为unicode转义序列,并将其转换为类文件中的一个unicode字符。单个字符'\ u0627'和字符串“\ u0627”没有区别对待。我不相信getUnicodeChars会为这个示例代码做任何事情,所以我很惊讶这是被接受的答案。 –

+0

要澄清,在最后一块代码:txt.length()将返回7,而不是42. –

+0

@MichaelDonohue假设变量txt从数据流中加载 –

2

我在设备上显示日元符号而没有将设备区域设置设置为日语,只需通过将字符串表示形式(如您在示例中进行的操作)和j2me处理其余部分。但是,我不确定在这种情况下,方向将是从左到右。

默认情况下,设备没有阿拉伯字体,您确定它安装在设备上吗?当你这样做时:

Locale.get(Locale.LOCALE_ar, null)

你会得到空值或区域设置值吗?

更正:日元符号是而不是 unicode的值,但简单地作为明文(我从服务器获取它)。如果您将原始字符串以阿拉伯语存储在资源中(而不是unicode),它会显示什么?注意:将明文置于代码不起作用。

+0

感谢您的回复!你可以发布日元样本吗?是的,阿拉伯字体安装在设备上,我用本地化资源写了样本,工作完美。另外Locale.setDefault(Locale.get(Locale.LOCALE_ar,null)); 正在工作,因为文本方向更改为RTL –

+0

LabelField中会发生什么?你说它会变成RTL,那么什么不工作? – Tamar

+0

有没有阿拉伯语符号,Unicode序列,而不是... –