7

Java アプレットでアラビア文字を表示しようとしていますが、常に疑問符「?????」が表示されます。

私は多くの解決策を試しましたが、成功しませんでした:

  • new String(bytes [], charsetName) を UTF-8 デコードに使用します。
  • Netbeans のデフォルト文字セットの変更: VM オプションの -Dfile.encoding=UTF8 およびコンパイル オプションの -encoding UTF8。
  • エンコードには ByteArrayOutputStream を使用します。
  • UTF8 と UTF-8 の両方の文字セット名を使用します。

スペイン語環境で 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 に設定するシステムのデフォルトのエンコーディングを使用して bytearray を生成します。

正解: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、コンパイル時にパラメーターを設定する必要があります。それ以外の場合、コンパイラはシステムのデフォルトのエンコーディングを使用します。これはおそらくあなたの場合(Windows 7、スペイン語)では cp1252 であり、アラビア語をサポートしていません。

バイトへのすべての変換を削除する必要があります。それらは問題を悪化させるだけです。これがどのように機能するかです:

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

コンパイラ オプションを設定できない場合は、エスケープ コードを使用して文字を ASCII にエンコードできます。コマンド ライン ツールを使用native2asciiすると、この変換を行うことができます。たとえば、上記の 2 行に対して生成されるコードは次のようになります。

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 に答える