7

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

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

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

一些解决方案在运行 Netbeans 时有效,但在此环境之外不起作用。这是带有源代码和 .jar 的 Netbeans 项目

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

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());
    }
}
}

知道发生了什么吗?

4

7 回答 7

4

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

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

将编码更改为 UTF-8。

这里没有魔法。

于 2015-05-12T14:18:30.733 回答
2

我原来的答案是错误的:getBytes() 使用系统的默认编码生成一个字节数组,netbeans 将其设置为 UTF-8。

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

编辑:查看实际问题的评论和解释为什么解决方案不完全可能。

于 2013-02-21T11:39:16.347 回答
1

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 [这是错误的,请参阅我的其他答案],您可以使用它创建一个将数组解释为 UTF-8 的字符串

于 2013-02-21T09:58:36.600 回答
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);
于 2013-02-21T11:55:32.663 回答
1

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

于 2016-10-18T16:30:57.630 回答
0

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

JLabel jlbl1 = new JLabel("الملف غير موجود");
JOptionPane.showMessageDialog(null,jlbl1,"تنبيه", JOptionPane.ERROR_MESSAGE);
于 2018-02-21T15:23:47.677 回答
0

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

解决方案:

  1. 转到控制面板-> 区域。
  2. 打开管理选项卡。
  3. 单击“将系统本地更改为阿拉伯语”。
  4. 重新启动服务器。
于 2018-03-19T10:50:26.940 回答