- - PR -
Linux上でファイル名がMS932のファイルを開く
投稿者 | 投稿内容 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2007-03-29 14:14
あぶです、よろしくお願いいたします。
Linux(RHL v.4)上にファイル名がMS982のファイルがあり、 LANGの設定は、
となっています。 # コンソール上はもちろん化けています。 そのファイルをJavaプログラムからオープンしたいのですが、
などとして開いてみましたが、 ひらがなカタカナは開けるが漢字が入るとダメという不思議な現象となっています。 LinuxのLANG設定をMS932にするのが正道かと思いますが、 他のプログラムに影響する可能性があり、許可がおりないかも知れません。 # LANGの設定はShift_JISにする方法の情報しか見あたりませんがMS932でなくても大丈夫でしょうか? このような場合、プログラムで解決する方法はありますでしょうか? ※RHLの設定はあくまで仕様書で確認しただけで、実際には違う可能性もあります。 現在、確認するのが難しい状況となっておりますので、ご理解ください。 | ||||||||||||
|
投稿日時: 2007-03-29 16:01
Linux上でLANG="ja_JP.UTF-8"だった場合は、LinuxにはUCS-2/UTF-16系の ファイル名を受け取るAPIはないので、JREはファイル名として使う場合に UTF-8への変換(open(2)のパラメータとして使うため)をかけるはずです。 この変換が使われたとすると、 「あ」の0x82A0はStringでの表現(U+0082 U+00A0)を経て UTF-8になった時には0xC2 0x82 0xC2 0xA0となるので、 ひらがなカタカナが化けないのが腑に落ちませんが・・・。 この条件ならば、自力で変換したものを使わせるにはLANG環境変数、 もしくはfile.encodingシステムプロパティ(もしかしたら違うかも)で ISO-8859-1等を指定すれば回避できそうに思います。 これで多くの文字は回避できたとしても、 今度はUnicode <-> Shift_JISのマッピングの違いにひっかかると思います。 こちらの回避策は、MS932とShift_JISのどちらでもダメだった場合は、 化ける文字を個別に自力で変換するくらいでしょうか。 運良くファイル名に化ける文字が出てこなければこれでいいかもしれません。
SJISかどうかは別にして、システム全体で統一するのがベストです。 Shift_JIS系のエンコーディングは\(0x5C)の問題が大きいので、 やはりUTF-8かEUC-JPにするのが正道でしょう。
Unicode <-> Shift_JIS系のマッピングはバラバラで統一性が無く、 Shift_JISの個々のバリエーションを区別しない環境も多いと思います。 JREにように厳密に規格に従おうとする製品は少数派でしょう。 | ||||||||||||
|
投稿日時: 2007-03-29 16:34
あしゅさん、ありがとうございます。
。。。今、やっとサーバ室に入れました。 そこで、何点か情報を修正します。
LANG="ja_JP.eucJP"の誤りでした。
上記はエビデンスも残っておらず、テストミスだったようです。 僕がテストしたところ、ひらがなもカタカナもダメでした。 そこで、質問を定義しなおすと、 Javaで、ファイル名のエンコードがデフォルトエンコーディング以外の場合、 そのファイルにアクセスする方法はありますか? ということです。 また別スレッドで、ファイル名自体をデフォルトエンコーディングにするための 質問もしています。 件名:NFSでマウントされたディレクトリにファイル名がEUCのファイルを作成できるか? http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=37602&forum=12 どちらかの方法で対応したいと思っています。 | ||||||||||||
|
投稿日時: 2007-03-29 18:37
前の書き込みの方針でおそらく可能だと思いますが、 ちょっと設定が変わったり、何かのバージョンを更新して 挙動が変わったりすると動かなくなるかもしれません。 アブノーマルな運用の自覚と覚悟があるなら試してみましょう。 当然ながら、まともな解決策はエンコーディングを揃える事です。 NFSサーバ(Linux:EUC-JP) <-> NFSクライアント(Windows:SJIS) という状況で両者でエンコーディングを揃えられないのであれば、 sambaにすればサーバ側で任意に変換できるので解決できますよ。 | ||||||||||||
|
投稿日時: 2007-03-29 19:20
あしゅさん、ありがとうございます。
ということは、 System.setProperty("file.encoding", "MS932"); か、 java -Dfile.encoding=MS932 XXXX で、アクセスできるということですか? # このプロパティはファイルの内容だけかと思っていましたが、 # ファイル名もOKなんですね ファイルシステムがEUCでファイル名がMS932という特殊な環境ですので、 すぐにテストできる状況にはありませんが、 試して、報告いたします。 | ||||||||||||
|
投稿日時: 2007-03-29 19:56
あっ、
MS932ではなくて、ISO-8859-1ですね。 なにゆえですか? | ||||||||||||
|
投稿日時: 2007-03-29 20:26
いや、、正直試してみないとわかりません。 どこかで変換をかけなければいけないのは確かだと思うのですが、 他に関係しそうなシステムプロパティが思いつかなかったので。 Linuxではシステムのエンコーディングは環境変数LANG以外から 取得することは基本的にできないので、その周辺を使うはずです。 別のプロパティを見ているとすれば、むしろ都合は良さそうです。 file.encodingを変えてしまうとログ等にも影響してしまうでしょうし。
ISO-8859-1にするのは、getBytes()後にString化する場合です。 最初のコードをそのまま使って試す場合を想定して書きました。 | ||||||||||||
|
投稿日時: 2007-03-30 00:22
>java -Dfile.encoding=MS932 XXXX
> >で、アクセスできるということですか? 確か、file.encoding はリードオンリーのシステムプロパティです。 [ メッセージ編集済み 編集者: インギ 編集日時 2007-03-30 00:22 ] |