我想在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());
}
}
}
知道发生了什么事吗?
答案 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。
解决方案: