
▽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からファイル名を取得することは可能でしょうか?
No.2ベストアンサー
- 回答日時:
こんばんは。
>もしそうなら、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/
org.apache.tools.zip.ZipFileで、zipファイルを作成する時にEUCに変換しておくのですね。参考になります。
私はいろいろ試した結果、日本語版samba付属のtoolでファイル名の文字コードを変換するツールを使用しました。
標準で「/usr/local/samba/bin/sjistoeuc」にインストールされるコマンドで半角カナや機種依存(IIなど)も上手く変換できました。
本来ならjava.io.Fileに文字コードを指定できるような仕組みがあれば最高なのですが(^^;
ご回答ありがとうございました。
No.3
- 回答日時:
File.list()でFileの配列を取得するんですよね?
ソースを追っていくとUnixFileSystem.javaに行き着きました。
そこでファイルパス(JavaのUTF16文字列)の配列を生成する関数list(File)があったんですが、以下のようにnativeでした。
public native String[] list(File f);
このJNIがポイントなんでしょうなぁ。
参考URL:http://www.carfield.com.hk/java_store/sun1.5/jav …
nativeコードが古いままなのかもしれませんね。
JAVAもここまで普及してきたので、こういった細かいところの仕様見直しも随時行って欲しいですよね。
ご回答ありがとうございました。

No.1
- 回答日時:
実際に試していないで想像なので確かなところはわかりませんが・・、パスとして取得した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)で解消されてたら嬉しいですね。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
PHP8でWarning:Undefined varia...
-
VBAでActiveDirectoryのユーザ...
-
C#でネットワーク(LAN)上のPC...
-
VB.NETで DataRow()を利用して...
-
Spreadの選択行の取得について
-
getParameter と getAttribut...
-
ListViewで複数選択された項目...
-
エクセルVBA リストボック...
-
DataGridView 複数選択で行番...
-
JSP+Servletでのページングの常識
-
既存のアプリのsyslistview32か...
-
VBScriptで数値にコンマを付け...
-
【Delphi】自分と現在接続して...
-
Flexgridで選択行の列の値を取...
-
IFRAME内のURLを取得したです。
-
JavaScriptでWindowsログオンID...
-
エクセルVBAで複数選択できるよ...
-
array関数で格納した配列の型を...
-
エクセルで、絶対値の平均を算...
-
【ACCESS】リレーションを組ん...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VB.NETで DataRow()を利用して...
-
ListView 項目の選択/選択解除...
-
count(*)で取得した値をJAVAの...
-
VBAでActiveDirectoryのユーザ...
-
PHP8でWarning:Undefined varia...
-
データ数をカウントしたいのですが
-
利用者側のMACアドレスを取得し...
-
VBA:小数点以下の数字を取得で...
-
Flexgridで選択行の列の値を取...
-
JSP+Servletでのページングの常識
-
JavaScriptにおいてコンピュー...
-
like演算子内に変数って使えな...
-
JavaScriptでWindowsログオンID...
-
エクセルVBAで複数選択できるよ...
-
getParameter と getAttribut...
-
URIでのページの移動について
-
「Excel VBA」 Webクエリ マク...
-
郵便番号検索APIにてget Elemen...
-
DOS窓の非表示
-
EXCELのリストボックスを選択し...
おすすめ情報