- ベストアンサー
SJIS日本語ファイル名をEUC-JP環境で取得する方法
▽SJIS日本語ファイル名をEUC-JP環境で取得する方法について。 ・Windowsで保存したファイル名が日本語(SJIS/MS932)のファイルをフォルダごとZIP圧縮し、Solaris9(EUC-JP環境)で解凍しています。 ・J2SDK(1.4.1_06)を使用。 ・JAVAで作成したローカルアプリケーションで解凍したファイル名の一覧を取得し、何らかの処理を加えた後、別のディレクトリへコピーしたいと考えております。 ・lsコマンドで受信文字コードをSJISにすると文字化けせずにファイル名を表示可能。 ここで問題になるのが、java.io.FileのgetAbsolutePath()なのですが、取得した文字が化けていて認識できません。 *toString()、getPath()、getName()でも同じ結果。 J2SDKのソースは読んでいないので内部でどういった処理が行われているのか判りません。 ---------------------------------------- [元のSJIS文字列]サンプル 部長会議事録(13.7.13).doc ---------------------------------------- [16進DUMP] 3F 3F 3F 3F 3F 3F 3F 3F 3F 2E 3F 2E 3F 3F 3F 2E 64 6F 63 *上記から「.doc」は化けていないのがわかります。 ---------------------------------------- 通常、このようなケースでjavaからファイル名を取得することは可能でしょうか?
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
こんばんは。 >もしそうなら、j2sdk(1.5)で解消されてたら嬉しいですね。 ダメなのです。 j2sdk(1.5)で実験しましたが、うまくいきません。 >16進DUMP] >3F 3F 3F 3F 3F 3F 3F 3F 3F 2E 3F 2E 3F 3F 3F >2E 64 6F 63 文字列が原形をとどめていないようなので、Javaから直接Zipファイルを扱ったほうがよいと思い、java.util.zip.ZipFileを使ってみました。 WindowsXPで圧縮し、そのまま、java.util.zip.ZipFileを使ってみましたが、日本語ファイル名が見事に文字化けしました。 >java.io.Fileの内部処理でファイル名を取得する時にSJISを >無理やりEUC(JAVAの稼動している環境のコード)としてunicode >に変換してるということはないでしょうか? というより、SJISを無理やりUTF-16として解釈しようとしているようです。 この文字化けを解消しようと#1さんの方法を試したり、 String fileName = zipEntry.getName(); byte[] nameByte = new byte[fileName.length()]; for(int i = 0; i < fileName.length(); i++) nameByte[i] = (byte)fileName.charAt(i); System.out.println(new String(nameByte, "windows-31j")); こんなことやったりしましたが、ある程度回復できてもどうしても文字化けが残ります。 結局、結論としては、org.apache.tools.zip.ZipFileを使えばうまくいきました。 Apache Antに含まれているツールです。 ZipFileをnewするときに、ちゃんとエンコードを指定してやれば、kfgoodyさんの環境でもうまくいくはずです。 GPLに関して何か問題がある場合は無理ですが・・・。 どうでしょう?
- 参考URL:
- http://ant.apache.org/
その他の回答 (2)
- seijro
- ベストアンサー率50% (3/6)
File.list()でFileの配列を取得するんですよね? ソースを追っていくとUnixFileSystem.javaに行き着きました。 そこでファイルパス(JavaのUTF16文字列)の配列を生成する関数list(File)があったんですが、以下のようにnativeでした。 public native String[] list(File f); このJNIがポイントなんでしょうなぁ。
お礼
nativeコードが古いままなのかもしれませんね。 JAVAもここまで普及してきたので、こういった細かいところの仕様見直しも随時行って欲しいですよね。 ご回答ありがとうございました。
実際に試していないで想像なので確かなところはわかりませんが・・、パスとして取得したStringのキャラクタエンコーディングを変換すれば正しく取得できないでしょうか。 例えばStringのgetBytesなどでエンコーディングを指定した形でbyte配列を取得し、それをもとに新しいStringを作成したらどうでしょう。
お礼
ご回答ありがとうございました。
補足
それも試してみたのですがダメだったのです。 実際に試したのは「new String(文字列.getBytes(文字コード1), 文字コード2)」でSJIS、EUC-JP、JISAuto~、ISO~、MS~などを何パターンか組み合わせたものです。 これはカンなのですが、java.io.Fileの内部処理でファイル名を取得する時にSJISを無理やりEUC(JAVAの稼動している環境のコード)としてunicodeに変換してるということはないでしょうか? *そこまで言うならソースを読めといわれそうですが(^^; もしそうなら、j2sdk(1.5)で解消されてたら嬉しいですね。
お礼
org.apache.tools.zip.ZipFileで、zipファイルを作成する時にEUCに変換しておくのですね。参考になります。 私はいろいろ試した結果、日本語版samba付属のtoolでファイル名の文字コードを変換するツールを使用しました。 標準で「/usr/local/samba/bin/sjistoeuc」にインストールされるコマンドで半角カナや機種依存(IIなど)も上手く変換できました。 本来ならjava.io.Fileに文字コードを指定できるような仕組みがあれば最高なのですが(^^; ご回答ありがとうございました。