试图用Java显示阿拉伯字符

时间:2013-02-21 09:38:12

标签: java utf-8 character-encoding applet arabic

我想在Java小程序中显示阿拉伯字符,但我总是得到问号'?????'。

我尝试了许多解决方案但没有成功:

我在西班牙语环境中使用Windows 7.

某些解决方案在运行Netbeans时有效,但它们无法在此环境之外工作。这是Netbeans project with sources and .jar

这是我正在使用的简单代码:

package javaapplication4;

import java.io.ByteArrayOutputStream;
import java.nio.charset.Charset;
import javax.swing.JApplet;
import javax.swing.JOptionPane;

public class JavaApplication4 extends JApplet{

@Override
public void init(){
    try {

        String str1 = new String("تعطي يونيكود رقما فريدا لكل حرف".getBytes(), "UTF-8");
        JOptionPane.showMessageDialog(rootPane, str1);

        String str2 = new String("تعطي يونيكود رقما فر");  
        ByteArrayOutputStream os = new ByteArrayOutputStream();
        os.write(str2.getBytes());
        JOptionPane.showMessageDialog(rootPane, os.toString("UTF-8"));

    } catch (Exception ex) {
        JOptionPane.showMessageDialog(rootPane, ex.toString());
    }
}
}

知道发生了什么事吗?

7 个答案:

答案 0 :(得分:3)

os.toString(...)是错误的方法。它假设ByteArrayOutputStream中的字符是utf-8,这是不正确的,因为java使用utf-16。另一方面,该方法的输出是一个有效的java字符串,它再次是:utf-16。

因此,您使用包含utf-16字符的数组将其解释为utf-8并将其转换为utf-16。那里有你的问题^^

编辑:与该行相同的问题:

new String("تعطي يونيكود رقما فريدا لكل حرف".getBytes(), "UTF-8");

getBytes()产生UTF-16 [这是错的,看到我的其他答案],你用它来创建一个String,将数组解释为UTF-8

答案 1 :(得分:2)

我的原始答案是错误的:getBytes()使用系统的默认编码生成一个bytearray,netbeans设置为UTF-8。

正确答案:根本不要使用ByteArrayOutputStream和新的String(byte [],Charset)。只使用字符串。应该工作正常。

编辑:请参阅有关实际问题的评论,并解释为何不能完全解决问题。

答案 2 :(得分:2)

最简单的解决方案将正常使用字符串并更改工作区中的默认编码,例如eclipse。

Windows - >首选项 - >常规 - >工作区 - >文本文件编码

将编码更改为UTF-8。

这里没有魔力。

答案 3 :(得分:1)

如果您的源代码是以UTF-8编码的,则必须在编译时设置-encoding参数。否则编译器将使用系统的默认编码,在您的情况下可能是cp1252(Windows 7,西班牙语),并且不支持阿拉伯语。

您应该将所有转换删除为字节,它们只会使事情变得更糟。这是它应该如何工作:

String str1 = "تعطي يونيكود رقما فريدا لكل حرف";
JOptionPane.showMessageDialog(rootPane, str1);

如果无法设置编译器选项,则可以使用转义码对ASCII中的字符进行编码。 native2ascii命令行工具可以为您执行此转换。例如,为上面两行生成的代码将是:

String str1 = "\u062a\u0639\u0637\u064a \u064a\u0648\u0646\u064a\u0643\u0648\u062f \u0631\u0642\u0645\u0627 \u0641\u0631\u064a\u062f\u0627 \u0644\u0643\u0644 \u062d\u0631\u0641";
JOptionPane.showMessageDialog(rootPane, str1);

答案 4 :(得分:0)

将设置编码从Eclipse上的编辑菜单更改为UTF-8

答案 5 :(得分:0)

我想向你展示一个非常有用的代码,关于jOptionPane消息中的阿拉伯语,我使用jlabel来解决这个问题,试试这个:

 <script type="text/javascript">
	var anchors = document.getElementsByTagName("a");

for (var i = 0; i < anchors.length; i++) {
    anchors[i].href = "http://test.com/url=" + anchors[i].href
}

  </script>

答案 6 :(得分:0)

我在Windows Server 2016中遇到过这个问题,我的阿拉伯字符传递为“???”在Netbeans。

解决方案:

  1. 转到控制面板 - &gt;区域。
  2. 打开“管理”标签。
  3. 点击“将系统本地更改为阿拉伯语。”
  4. 重新启动服务器。