▽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で質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) ファイル名の右側を変更したい ファイル名:「1001日別売上」の左側へ「2022」を追加し、「202 6 2022/10/14 10:03
- Visual Basic(VBA) 集めたシートのシート名を変更したい。 下記のコードでサブフォルダにあるファイルのSheet3を集めて 6 2022/08/23 10:38
- PHP PostgreSQLからCSV形式でエクスポートする際にカラム内の改行をとる方法 1 2023/02/22 10:05
- Excel(エクセル) Excelにて、フォルダ内のTextファイルをマクロで統合すると文字化けしてしまう時の解消コード 4 2023/01/01 07:32
- Visual Basic(VBA) 入力ボックスが繰り返しポップアップして止まらない。 下記コードでファイル名の変更をしたいのですが、変 1 2022/09/08 11:27
- Google Drive 【Googleドライブ】ドライブ上内でのフォルダ移行について 4 2022/11/30 12:50
- Visual Basic(VBA) サブフォルダ(データ)にある複数の.xlsxファイルのSheet3のA2セルの値で01から左側をB2 2 2022/08/14 15:46
- UNIX・Linux テキストファイルをページ番号付きでコマンドラインから印刷したい 1 2023/02/22 12:47
- Windows 10 Windows10の回復環境 2 2023/02/03 19:13
- Excel(エクセル) フォルダ内のワードファイルをPDFに一括変換するVBA 3 2023/06/09 16:51
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
count(*)で取得した値をJAVAの...
-
VBAでActiveDirectoryのユーザ...
-
Yahoo! JAPANのID取得について
-
VB.NETで DataRow()を利用して...
-
ディスプレイの表示可能な解像...
-
VBA:小数点以下の数字を取得で...
-
C言語におけるコンピュータ名・...
-
データ数をカウントしたいのですが
-
年月日時分秒の変数を教えて下さい
-
ListView 項目の選択/選択解除...
-
エクセルVBAで複数選択できるよ...
-
エクセルVBAで別ファイルのデー...
-
時間を分に変換するプログラム
-
UWSCでhtmlソースの文字列を取...
-
COMポート 名前を取得する方法
-
Flexgridで選択行の列の値を取...
-
like演算子内に変数って使えな...
-
ASP.NETでIPアドレスログイン管...
-
ActiveWorkbook.Path取得できない
-
利用者側のMACアドレスを取得し...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBAでActiveDirectoryのユーザ...
-
VB.NETで DataRow()を利用して...
-
ListView 項目の選択/選択解除...
-
VBA:小数点以下の数字を取得で...
-
count(*)で取得した値をJAVAの...
-
データ数をカウントしたいのですが
-
like演算子内に変数って使えな...
-
ListViewで複数選択された項目...
-
Flexgridで選択行の列の値を取...
-
エクセルVBAで複数選択できるよ...
-
JavaScriptでWindowsログオンID...
-
利用者側のMACアドレスを取得し...
-
郵便番号検索APIにてget Elemen...
-
COMポート 名前を取得する方法
-
コンボボックス表示文字列を取...
-
VBA Shapesの座標からセル位置...
-
Spreadの選択行の取得について
-
VBScriptで数値にコンマを付け...
-
C言語におけるコンピュータ名・...
-
Excel VBA でログインしてい...
おすすめ情報