• ベストアンサー

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からファイル名を取得することは可能でしょうか?

  • Java
  • 回答数3
  • ありがとう数6

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

  • ベストアンサー
  • PecoPlus
  • ベストアンサー率76% (144/188)
回答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/
kfgoody
質問者

お礼

org.apache.tools.zip.ZipFileで、zipファイルを作成する時にEUCに変換しておくのですね。参考になります。 私はいろいろ試した結果、日本語版samba付属のtoolでファイル名の文字コードを変換するツールを使用しました。 標準で「/usr/local/samba/bin/sjistoeuc」にインストールされるコマンドで半角カナや機種依存(IIなど)も上手く変換できました。 本来ならjava.io.Fileに文字コードを指定できるような仕組みがあれば最高なのですが(^^; ご回答ありがとうございました。

その他の回答 (2)

  • seijro
  • ベストアンサー率50% (3/6)
回答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/java/io/UnixFileSystem.java?wrapped=true&
kfgoody
質問者

お礼

nativeコードが古いままなのかもしれませんね。 JAVAもここまで普及してきたので、こういった細かいところの仕様見直しも随時行って欲しいですよね。 ご回答ありがとうございました。

noname#49664
noname#49664
回答No.1

実際に試していないで想像なので確かなところはわかりませんが・・、パスとして取得したStringのキャラクタエンコーディングを変換すれば正しく取得できないでしょうか。  例えばStringのgetBytesなどでエンコーディングを指定した形でbyte配列を取得し、それをもとに新しいStringを作成したらどうでしょう。

kfgoody
質問者

お礼

ご回答ありがとうございました。

kfgoody
質問者

補足

それも試してみたのですがダメだったのです。 実際に試したのは「new String(文字列.getBytes(文字コード1), 文字コード2)」でSJIS、EUC-JP、JISAuto~、ISO~、MS~などを何パターンか組み合わせたものです。 これはカンなのですが、java.io.Fileの内部処理でファイル名を取得する時にSJISを無理やりEUC(JAVAの稼動している環境のコード)としてunicodeに変換してるということはないでしょうか? *そこまで言うならソースを読めといわれそうですが(^^; もしそうなら、j2sdk(1.5)で解消されてたら嬉しいですね。

関連するQ&A

  • C++でEUC-JPをSJISに変換したい。

    C++で、ライブラリなど使わずにcsvファイルの文字コードEUC-JPをSJISに変換しようと試行錯誤しましたができませんでした。 googleなどで検索したのですが、なかなかうまくいかず手詰まり気味で投稿させていただきました。 16進数の値で調整するのは理解したのですが、ファイル全部を一括でする方法が導き出せませんでした。Linuxのiconvコマンドみたいにさっくりできたら良いのですが、C++だと難しく・・・。 ご存知の方、ご教示を宜しくお願いします。 環境はLinuxのC++で変換するプログラムです。

  • iisでsjisとEUC-JPを同時に動かすためのmbstring?

    windows2000pro+iisでsjisとEUC-JPの二つの文字コードで書いた HTMLを同時に動かすためのmbstringの設定をご存知の方 教えてください。今はその都度php.iniを書き換えています。

    • ベストアンサー
    • PHP
  • 現在使用しているJAVAファイルのあるパス名を取得する方法

    JAVAアプレットで、FileInputStreamを使っていまして、読み込むファイル を絶対パスで指定しています。 ※なぜか絶対パスでないと、ファイルを読み込まないのでそうしています。 それで絶対パスで指定してあるわけですが、このプログラムをいずれ色ん なマシンに入れ込む予定ですが、マシンの環境によってはCドライブ以外 にインストールすることも考えられます。 その為、絶対パスできってあるため、Dドライブなど、Cドライブ以外にイ ンストールされた場合用に、各プログラムを手直ししないといけません。 出来れば、その手間を省きたいと思っています。 今考えているのは、対象となるファイル(JAVAファイル又はクラスファイル) のパス名を取得して、そこからsubstringで変数に入れ込んだ値の先頭から 3文字を取得してドライブ名を取得出来るようにして、最終的に取り込む ファイルの先頭に、取得したドライブ名を入れ込んでやればいけるのかな? と思っています。 それで肝心の、パス名を取得する方法ってありますでしょうか? ちなみにgetPathと言うものがありますが、やってみた所うまくいきません でした。やり方が悪かったのかな? 簡単ですが、以下のような感じでgetPathを使ってみました。 public class Test extends Applet{ Test test = new Test(); String Dire; public void init(){ Dire = test.getPath(); } }

    • ベストアンサー
    • Java
  • utf-8のマシンでsjisのデータファイルを読込み、eucでファイルに出力する方法

    utf-8のLinuxマシンで、sjis(改行コードCR+LF)のデータファイルを読込み、euc-jp(改行コードLF)でファイルに出力したいのですが、どのようにすればよいでしょうか。プログラム実行前後に入出力ファイルを直接コード変換することは考えておらず、全て一つのプログラム内でやりたいと考えています。 &jcode'convertで変換するのかなと思っているのですが、読込み時・書き込み時のどちらでやるべきなのか、あるいは両方やるべきなのか分かりません。データには、「・」「I,II」などの特殊文字(?)が含まれているので、それらの文字で問題が起きないかなどもちょっと心配です。 また、&jcode'convertでeucに変換すれば、改行コードも一緒にCR+LFからLFに変換されるものでしょうか。 文字コードのことがよく分かっていないので、的外れな質問になっているかもしれませんが、ご教示願います。

    • ベストアンサー
    • Perl
  • SJISファイルを日本語でgrep

    UNIX環境で、 SJISファイルを日本語でgrepしたのですが、 ファイル名が出力されずにうまくいきません。 どなたかご教授願えないでしょうか。 [自分のコマンド] find ./ -type f -print | xargs nkf -e | grep 'テスト' とし、日本語は検地できたのですが、 ファイル名が出力されずに困っております。 grep -l としたら、↓のエラーが表示されました。 xargs: nkf: シグナル 13 によって終了しました サブディレクトリも含めて検地したいのですが、 なにかいい方法ありますでしょうか。

  • 取り込みたいCSVファイルはSJIS、私のHPはEUC。

    新規であるサイトからタブ区切りのCSVファイルを取り込もうと思っています。 CSVはhttp://sample.csvという形で公開されており、コードはSJISです。 私のHPはEUCで書いているので文字コードの違いで悩んでいます。 ■こんな形で取り込んでみました。 $data=file('http://sample.csv'); foreach($data as $new_data){ list($n1,$n2,$n3,$n4,$n5,$n6,$n7,$n8,$n9)=split("t",$new_data); echo $n1 . "<br>"; } ■解決案 この一行を様々な箇所に入れてみるのですがどこで使っても 取り込んだ$n1の日本語がEUCで表示されません。 $n1=mb_convert_encoding($n1,"EUC-JP","SJIS"); 出来れば取り込んだ時点全ての変数をEUCに変えたいんですが、 うまくいきません。 一旦CSVファイルを自分のサイトに取り込み保存するなどしてそれを使いまわす方がよいのでしょうか? 原因を考えるのですが行き詰っています。どなたかお力をお借りできればありがたいです。 (またこのPHP文章の場合CSVの行数が100行なら$n1が100行全て表示されてしまいます。上から5つだけ$n1を表示などもかのうでしょうか?)

    • ベストアンサー
    • PHP
  • puttyの日本語版において、SJISファイルが文字化け

    (概要) puttyの日本語版をインストールしたのですが、SJISモードにしても、SJISのファイルを開いた際に、文字化けが発生してしまいます。 (詳細) (1)puttyの設定 ウィンドウ→変換においてSJISモードを設定 (2)サーバー上において、環境変数をLANG=ja_JP.ujisおよびLANG=ja_JP.SJISに設定 上記の設定(1)、(2)で、SJISファイルを開くと文字化けが発生します。 ちなみに、ウィンドウ→変換においてEUC-JPモードを設定し、環境変数をLANG=ja_JP.eucjpに設定した場合に、EUCのファイルを開いた際には、文字化けせずに表示できます。 原因および対処方法がお分かりになる方がいらっしゃいましたら、ご教示をお願いいたします。

  • 日本語ファイル名(EUC)が付いたjpgファイルの表示時の問題

    日本語ファイル名(EUC)を付けたjpgファイルをWebブラウザで開くと、そのファイル名がタイトル表示されます。 大多数の方のWebブラウザの文字エンコードのデフォルトはShift_JISと思いますがjpgファイルなので文字エンコードの指定も出来ず、結果文字化けして表示されてしまいます。 もちろんこのとき、ブラウザの文字エンコードを日本語(EUC_JP)に指定すれば正常に表示されます。 例えば.htaccessの設定で解決したいのですが手段が見つかりませんでした。ご存知の方がおられましたらよろしくお願いします。

  • DreamWeaverMXでファイルがEUC、METAタグがSJISのファイルを扱いたい

    お世話になっております。 DreamWeaverMX(6.1)にて、 ファイルの文字コードEUC、HTMLのMETAタグでSJISの設定の ファイルで開発したいと思っています。 ファイルの文字コードとMETAタグの文字コードが異なる場合、 文字化けを起こすことは、いくつかの質問で見かけました。 これらは、最新版のDreamWeaverでも、同じなのでしょうか。 回避方法があるのか、最新版では対応しているのか、 または、他のソフトGoLiveなどでは対応しているのか、 そのあたりの情報をお持ちの方はいらっしゃいませんでしょうか。 プログラマーは、テキストエディタで開発しているので問題ないのですが、 デザイナーは、DreamWeaverでデザインしています。 この状況で、なんとか、打開策を見出したいと思っています。 皆様のお知恵をお借りできればと思っております。 よろしくお願いします。

    • 締切済み
    • PHP
  • 日本語ファイル名の文字化けについて

    debian 3.1でsambaサーバを運用して複数のwindowsでファイル共有をしています。 何の不自由もなく使用していましたが、debianのコンソール上で共有ディレクトリを見ると 日本語のファイル名が「??-{?.txt」などと表示されるのが気になり、 convmvというツールでファイル名の文字コード変換を行いました。(euc-jpとsjisをutf8へ) ところが変換がうまくいかなかったらしく、コンソール上でもWindows上でも ファイル名が文字化けしてしまいました。 上記のツールで戻すことができなかったためコンソール上でリネームしようとしたのですが、 ファイル名に「-」や「(」が含まれているため失敗してしまいます。 変換に失敗したファイル名を元に戻す方法があればご教授ください。 よろしくお願い致します。

専門家に質問してみよう