• ベストアンサー

メモ帳で保存した日本語テキストや日本語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改行のみ対応です。

noname#179638
noname#179638
  • Java
  • 回答数4
  • ありがとう数73

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

  • ベストアンサー
  • 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

  • UTF-8とUTF-16およびUTF-32について

    Unicodeにおける各文字エンコーディングについてですが なぜ、UTF-16およびUTF-32の文字コードがビッグエンディアンとリトル・エンディアンの二通りの組み合わせを許容できてUTF-8が許容できないのかがわかりませんなぜでしょうか?

  • WIN-XPでテキストをECUコードで保存できますか?

    カテゴリがよく分からなかったので、間違っていたらすみません。 ある所からフォームのタグを借りてきたのですが、 「コードをECUで保存」しないと、正確に作動しない場合があります。 との表記があり、 その通り他のコードではちゃんと機能しませんでした。 ノートパッドに写してマイドキュメントに保存しているのですが、 その際に使用できるコードが ・ANSI ・Unicode ・Unicode big endian ・UTF-8 の4つしか選択できませんでした。 保存の仕方に何か問題があるのでしょうか? ECUコードで文字ファイルを保存する方法がないか、 どなたかご存知ありませんでしょうか? 使用しているPCはWIN-XPです。 どうかよろしくお願い致します。

  • メモ帳を保存するときに 文字制限

    メモ帳を保存するときに文字コードを どれかを選択すると、文字制限があって、その文字数を超えると保存できなくなると聞いたのですが どの文字コードでしょうか? ANSIかUnicodeだったきがします。よろしくお願い致します。

  • 文字コードの変換について教えてください

    文字コードUTF-16、Little-Endian、改行コードCR/LF、BOMのデータを読み込み、 シフトJISに変換して処理するため、次のようにしたのですが、 中ほどのデータが消えてしまいます。 何か間違っていますか? require 'nkf' ... text = file_in.read text_shiftjis = NKF.nkf('-sW16L',text)  p text_shiftjis #確認用出力

    • ベストアンサー
    • Ruby
  • XML宣言の省略、文字コード指定について

    今、WEBの事を勉強している身です。 "XML 宣言が省略されると,文字コードセットは UTF-8 または UTF-16 になる。"という記述がされた解説サイトを目にしました。 もし文字コードをUTF-8にしたいとして、XML宣言を省略する場合は、 <head>タグ内に「<meta http-equiv="Content-Type" content="text/html; charset=utf-8">」という文字列を記述しなくてもよいのでしょうか? 記述した方がよいかもしれませんが、記述しなくても問題無いのでしょうか?

  • Vimで改行コード、文字コードを指定して保存するには

    初歩的な質問です・・・。 操作を覚えたいため、WindowsでVimをはじめました。 Vimで文字コードを指定して保存する操作はできたのですが([ファイル]-[エンコード指定]-[保存]-[(指定の文字コード)])、 改行コードを指定して保存する方法がわかりませんでした・・・。 例えば、Shift-Jis,CR+LFのテキストをVimで開いて、文字を挿入した(編集した)あとに、UTF-8,LFで保存したいのですが・・・。 [ずんwiki - vim] http://www.kawaz.jp/pukiwiki/?vim#of617c72 を、今 参考にしているのですが、よくわかりません・・・。 よろしければ、教えてください。

  • UNICODEとは何なんですか

    Shift-JISからUTF8への切り換えを勧められ、 今、文字コードや改行コードについて調べています。 取り敢えずUTF-8への変換ツールをダウンロードしてきたところです。 それで凄く分からなくなったのですが、 UNICODEって文字コードを国際的に統一しましょうって規格ですよね。 Wikiを見たらUTF-7、UTF8、UTF-16、UTF-32とあって、 更に5や9もあって、UTF-8にもBOM付きだの何だのとありました。 まるっきり統一するぞってやる気が感じられないのですが どうしてこんなに乱立しているのですか? 今後はノーマルのUTF-8(BOMなし)だけを意識すればいいのでしょうか。 以上2点のうち分かる方で結構ですので宜しくお願いします。

  • xml宣言の文字コード変更

    xhtmlとcssでのコーディングを行った際、途中で「UTF-8」で作成してと言われました。 そのため、作成していたコードの冒頭をshift_jisからUTF-8にかきかえてみたところ、文字化け。ブラウザの表示をUTF-8に変えても化けたままなので、作業にならんと宣言をshift_jisに戻しました。 が、書き換えても文字化けが直りません。 宣言自体を消して保存しなおしたりもしたのですが、以前文字化けたままです。 テキストエディタで見るとちゃんとshift_jisになっているのですが、 これはどうすれば直るものなのでしょうか? 手を入れたのは以下の二行になります。(抜き出してるだけですので実際はheadタグ等を挟んでいます) 初期 <?xml version="1.0" encoding="shift_jis"?> <meta http-equiv="content-type" content="text/html; charset=shift_jis" /> ↓ UTF-8に書き換え <?xml version="1.0" encoding="UTF-8"?> <meta http-equiv="content-type" content="text/html; charset=UTF-8" /> ご教授ねがいます。

  • メモ帳で文字コードの警告がでます。

    メモ帳で文字コードの警告がでます。 メモ帳でシフト+JISコード形式のHTMLホームページ(日本語)を作っています。 C:\Users\個人ユーザー名\Documents\サイト名\フォルダ\ファイル名.htmlですが、 上書きをしようとすると<このファイルは、ANSIテキストファイルとして保存すると失われてしまうUnicode形式の文字を含んでいます。Unicodeの情報を保存するには、・・・>と あります。 プルダウンメニューからとりあえず「Unicode」を選択して上書き保存していますが、 文字化けなどderu出ないか心配です。 大丈夫でしょうか。 WindowsXPのときはこんなのが表示されませんでしたが、Windows7を使うようになってからこんな警告みたいな脅かしみたいのがでます。 (親切心であれば反って不安に駆られるのは私だけでしょうか)

  • VB6のテキスト処理 さまざまな文字コード/改行で対応

    VB6のテキスト処理で、Open InputとLine inputを使った場合に 文字コード/改行コードが SJIS/CRLFの時は正しく1行を読み込む事ができますが、改行がLFの時は正しく1行を読み取りません。 改行コードがLFもしくはCRの場合でも正しく1行を読み取る方法はあるのでしょうか? また、文字コードに関してもEUCやUTF-8,JISでも対応できる方法がありましたら教えて下さい。