2016-11-24 6 views
0

javaのユニコード文字を読み取ることができません。 Javaのユニコード文字を読み取ることができません

String inputLine = "تاريخالامتحان" 

私は

String tmp = new String(inputLine.getBytes(), Charset.forName("UTF-8")); 

    File file = new File("/home/gaurav/input.txt"); 

    // if file doesnt exists, then create it 
    if (!file.exists()) { 
     file.createNewFile(); 
    } 

    FileWriter fw = new FileWriter(file.getAbsoluteFile()); 
    BufferedWriter bw = new BufferedWriter(fw); 
    bw.write(content); 
    bw.close(); 

テキストファイルをテキストファイルに次の行を記述しようとする

はまだ同じテキストが含まれています。

注:多言語のテキストをサポートするテキストボックス(Tinymcエディタ)に以下のテキストを入力すると、入力行の内容がブラウザによって送信されます。中国語、フランス語などの言語テキストが含まれている可能性があります。 HTMLやXML、数値文字参照です

ت ا ر ي خ ا ل ا م ت ح ا ن

答えて

1
String inputLine = "ت... 

。これは、HTMLまたはXML文書内のتを意味します。どこにいても、アンパサンドは魔法の力を持たず、アンパサンド、ハッシュ記号、数字1578、セミコロンを意味します。

Java文字列リテラルで使用しました。 JavaはHTMLではありません。あなたはテキストファイルに結果を書いています。プレーンテキストもHTMLではありません。したがって、アンパサンドは特別な意味を持ちません。

Javaには、その番号から文字を参照する独自の方法があります。これは、バックスラッシュ-Uエスケープです。

String inputLine = "\u062A... 

あなたが今にそれを取得する必要があなたの文字列にアラビア語ました

(16進数0x062A =小数1578):形式があるので、あなたは、文字 ت、U + 062Aアラビア文字テーをしたいですファイル。これを行うには、ファイルのエンコーディングを選択する必要があります。UTF-8が必要ですが、アラビア文字に対応できる他のエンコーディングもあります。残念ながら...

FileWriter fw = new FileWriter(file.getAbsoluteFile()); 

は... JAVAを使用すると、エンコーディングを選択し、代わりに「デフォルトのエンコーディング」のためふっくらしないようにできるように不十分に定義されたインタフェースの負荷を持っています。このエンコーディングはマシンごとに異なり、ほとんどあなたが望むものではありません。あなたのマシンにはアラビア文字はまったく含まれていない可能性があります。

Javaでデフォルトのエンコーディングを使用しないでください。なぜなら、Javaのインターフェイスとチュートリアルでは、いつもそれを使用することが奨励されています。 のみが嫌いなデフォルトのエンコーディングを使用できるので、FileWriterクラスはロットの中で最悪です。とにかくFileOutputStream以上のOutputStreamWriterのための短いカギしかないFileWriterを使用しないでください。 OutputStreamWriterでは、本当に必要なエンコーディングを選択できます。これは、その後、デフォルトのエンコーディングを使用してバイトにinputLineをエンコードUTF-8を使用して文字列に戻し、結果として得られたバイトをデコードするでしょう

String tmp = new String(inputLine.getBytes(), Charset.forName("UTF-8")); 

:あなたがこれを行うべきではありませんちなみに

OutputStreamWriter fw = new OutputStreamWriter(new FileOutputStream(file), "utf-8"); 

。元の文字列が間違って誤ってデコードされていても、それが役に立つとは限りません。それは恐ろしい信頼できないデフォルトのエンコーディングに依存しているからです。ペーストされたエンコード/デコードサイクルでコードをペイントするという迷信に陥ることはありません。最初の場所で文字を取得するほうがはるかに優れています。

おそらくcreateNewFileビットは必要ありません。 FileOutputStreamはすでに新しいファイルの先頭に書き込みを開始します(append=trueに渡さない限り)。

関連する問題