• ベストアンサー

メモ帳で保存した日本語テキストや日本語XMLをJavaで読込、保存。メモ帳での保存文字コードはなにが推奨されるでしょうか?

 Windows9x系ではないWindowsVistaやXP、NT、2000のメモ帳(Unicodeのbig endianは保存できるがおそらくUnicodeのbig endianでのBOMなし保存不可。UTF-8は保存できるがUTF-8でのBOMなし(UTF-8N)の保存不可。Unicodeのlittle endianは保存できるが仕様なので言うまでもないがUnicodeのlittle endianでのBOMなし保存不可。)で保存した日本語テキストや日本語XMLをJavaで読込、保存。メモ帳での保存文字コードはなにが推奨されるでしょうか? やはりJavaのString型に近いUnicode big endianがよいのでしょうか? それともJava側で自動認識してくれるのでしょうか? XMLの場合は1行目でそのXMLファイルが使用している文字コードが何か宣言しますよね。 でもテキストファイルだと文字コードを宣言する場所がないみたいですし・・・(ここでの文字コードを宣言する場所としてはBOMは例外ですよ 念のため) 補足:メモ帳だとUnicode big endianで保存すると必ずBOMが付くみたいです。 メモ帳はLF改行が使えません。CR+LF改行のみ対応です。

質問者が選んだベストアンサー

  • ベストアンサー
  • thamansa
  • ベストアンサー率40% (95/232)
回答No.4

Windowsのメモ帳で読み書きするファイルを、Javaでも読み書きするとしたら、文字コードは何にするべきか、という質問でよろしいでしょうか。 それでしたら、文字コードは「MS932」にするのがよろしいと思います。 MS932とは、Windowsがデフォルトで使っている文字コード、いわゆる「シフトJIS」のことです。 Windows上で動くJavaプログラムは、デフォルトではMS932の文字コードでテキストファイルの読み書きを行います。 例 Reader r = new FileReader("input.txt"); Unix等のほかプラットフォームで動くJavaプログラムでしたら、 例 Reader r = new InputStreamReader(new FileInputStream("input.txt"), "MS932")); となります。 >FireInputStreamクラスってテキストじゃなくてバイナリを読むためのクラスですよね!?このクラスでよいのでしょうか? FireInputStreamはファイルをバイナリとして読みますが、FireInputStreamが読んだバイナリデータをInputStreamReaderが"MS932"と指定された文字コードで解釈するので、文字列データとして扱えるようになる仕組みです。

noname#179638
質問者

お礼

 ありがとうございました! WinXP以降のメモ帳であれば「MS932」の代わりに「UTF-8」でも 大丈夫なようです。 http://sdc.sun.co.jp/java/docs/j2se/1.4/ja/docs/ja/guide/intl/encoding.doc.html http://www.ingrid.org/java/i18n/encoding/table-j.html

noname#179638
質問者

補足

 thamansaさま、ご回答ありがとうございます。 特定の(MS932とは限らない)文字コードで保存する場合のプログラムはどのように書けばよろしいのでしょうか? FileOutputStreamクラスはなんとなく分かるのですが BufferedWriterとPrintWriterクラスのどちらを使えばよいのかが分かりません。  よろしくお願いいたします。 補足:将来はJavaFX Scriptで簡単にできるようになるかもしれませんね。 http://www.atmarkit.co.jp/news/200705/09/javafx.html

その他の回答 (3)

noname#33813
noname#33813
回答No.3

>FireInputStreamクラスってテキストじゃなくてバイナリを読むためのクラスですよね!?このクラスでよいのでしょうか? 手元にあったコードをサンプルでのせただけです。 どう実装するかは質問者様次第です。 サンプルは、FileInputStreamをデータソースとしてBufferedReaderでファイルを処理していますのでreadLineなどのReader系メソッドは普通に使用できます。 >InputStreamReaderクラスってファイルじゃなくてコマンドラインからキーボードで入力されたテキスト読むためのクラスですよね!? ちがいます。InputStreamから値を読み込むためのクラスです。 InputStreamとはその名の通り入力ストリーム(経路)のことで、 データソースが標準入力(System.in)や、ファイル、ソケットなどいろいろ扱えます。

noname#179638
質問者

お礼

 なるほど! クラス名をそのまま解釈すればよいのですね! よく考えれば分かる事でした。 こういう部分は英語圏の人のほうが有利かな・・・

noname#33813
noname#33813
回答No.2

>new BuffedReader(new FireReader("Foo.txt")); この場合、VMのデフォルト文字コードで解釈します。 >メモ帳ではUnicode big endian ってUTF-16のBOM付きのことですよね?(違ったら補足してください) だとするとJavaで読み込む際は 例) BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream("[ここにファイルパス]"), "UTF-16BE")); のようになります。 ※すいません。確認はしていません。 何か勘違いされているように思いますが、ファイルの文字コードは何でも構いません。 Javaでファイルを読み込む際に文字コードを指定することで、 そのファイルのバイト列を指定の文字コードでVMのコンバータがUCS-2(Javaの内部コード)にマップするのです。 従って、ファイルの文字コードとJavaでファイルを読み込む際の文字コード指定に差異があるとUCS-2へのマップが当然上手く行きませんので文字化けが発生するわけです。 >UCS-2の65535文字で表現できない文字は4バイトで表現するらしい いわゆるサロゲートペアとよばれるものです。 Javaは1キャラクタを16bitでしか表現できないため 2キャラクタで1文字として認識させるタイプの文字です。

noname#179638
質問者

補足

>メモ帳ではUnicode big endianってUTF-16のBOM付きのことですよね? ええ、そうです。 FireInputStreamクラスってテキストじゃなくてバイナリを読むためのクラスですよね!?このクラスでよいのでしょうか? InputStreamReaderクラスってファイルじゃなくてコマンドラインからキーボードで入力されたテキスト読むためのクラスですよね!? コンストラクタの第一引数がSystem.in以外も使えるんですね!!

noname#33813
noname#33813
回答No.1

テキストファイルについてはJava側で読み込むときに文字コードを指定します。 指定しない場合は、VMのデフォルト文字コードになります。 ※Readerクラスで読み込む場合を想定しています。 どのみちUTF系のコードは自動識別できなかったと思いますので自動判別が必要であれば実装者側で何らかの方式で判断する必要があります。 Javaがどうこうではなく、クライアントがWindowsだからMS932で縛るとかではNGでしょうか。 ぶっちゃけ、保存文字コードという意味だとJavaがコンバータを持っている文字コードであれば何でも良いと思いますが。 私が過去携わってきたシステムだと、クライアントがWindowsありきだったので ファイルの文字コードは全てWindows-31Jとして扱うことが一般的でしたね。

noname#179638
質問者

補足

 ARIA9さま、アドバイスありがとうございます!! new BuffedReader(new FireReader("Foo.txt")); たとえばこれの場合、メモ帳ではUnicode big endian(JavaのString型の文字コードであるUCS-2の互換性を持たせた拡張。UCS-2の65535文字で表現できない文字は4バイトで表現するらしい)で保存すれば文字化けせずに読めるのでしょうか? String型以外ってバイト配列ですよね、Swingとかのテキストフィールドに入力された日本語文字列の取得(getText()かな?この文法ってawtだけ?)の処理もString型で扱える文字コードであるUCS-2への文字コード変換が必要?(OSによって標準文字コードが違うから)

関連するQ&A

専門家に質問してみよう