- PR -

Linux上でファイル名がMS932のファイルを開く

投稿者投稿内容
あぶぽん
大ベテラン
会議室デビュー日: 2005/10/20
投稿数: 205
投稿日時: 2007-03-29 14:14
あぶです、よろしくお願いいたします。

Linux(RHL v.4)上にファイル名がMS982のファイルがあり、
LANGの設定は、

コード:
LANG="ja_JP.UTF-8"
SUPPORTED="ja_JP.UTF-8:ja_JP:ja"
SYSFONT="latarcyrheb-sun16"


となっています。

# コンソール上はもちろん化けています。

そのファイルをJavaプログラムからオープンしたいのですが、

コード:
fileName = new String(fileName.getBytes("MS932"));


などとして開いてみましたが、

ひらがなカタカナは開けるが漢字が入るとダメという不思議な現象となっています。

LinuxのLANG設定をMS932にするのが正道かと思いますが、
他のプログラムに影響する可能性があり、許可がおりないかも知れません。

# LANGの設定はShift_JISにする方法の情報しか見あたりませんがMS932でなくても大丈夫でしょうか?

このような場合、プログラムで解決する方法はありますでしょうか?

※RHLの設定はあくまで仕様書で確認しただけで、実際には違う可能性もあります。
 現在、確認するのが難しい状況となっておりますので、ご理解ください。
あしゅ
ぬし
会議室デビュー日: 2005/08/05
投稿数: 613
投稿日時: 2007-03-29 16:01
引用:

あぶぽんさんの書き込み (2007-03-29 14:14) より:
ひらがなカタカナは開けるが漢字が入るとダメという不思議な現象となっています。



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のどちらでもダメだった場合は、
化ける文字を個別に自力で変換するくらいでしょうか。

運良くファイル名に化ける文字が出てこなければこれでいいかもしれません。

引用:

LinuxのLANG設定をMS932にするのが正道かと思いますが、
他のプログラムに影響する可能性があり、許可がおりないかも知れません。



SJISかどうかは別にして、システム全体で統一するのがベストです。
Shift_JIS系のエンコーディングは\(0x5C)の問題が大きいので、
やはりUTF-8かEUC-JPにするのが正道でしょう。

引用:

# LANGの設定はShift_JISにする方法の情報しか見あたりませんがMS932でなくても大丈夫でしょうか?



Unicode <-> Shift_JIS系のマッピングはバラバラで統一性が無く、
Shift_JISの個々のバリエーションを区別しない環境も多いと思います。

JREにように厳密に規格に従おうとする製品は少数派でしょう。
あぶぽん
大ベテラン
会議室デビュー日: 2005/10/20
投稿数: 205
投稿日時: 2007-03-29 16:34
あしゅさん、ありがとうございます。

。。。今、やっとサーバ室に入れました。

そこで、何点か情報を修正します。

引用:

Linux上でLANG="ja_JP.UTF-8"だった場合は、LinuxにはUCS-2/UTF-16系の



LANG="ja_JP.eucJP"の誤りでした。

引用:

ひらがなカタカナが化けないのが腑に落ちませんが・・・。



上記はエビデンスも残っておらず、テストミスだったようです。
僕がテストしたところ、ひらがなもカタカナもダメでした。

そこで、質問を定義しなおすと、

Javaで、ファイル名のエンコードがデフォルトエンコーディング以外の場合、
そのファイルにアクセスする方法はありますか?


ということです。

また別スレッドで、ファイル名自体をデフォルトエンコーディングにするための
質問もしています。

件名:NFSでマウントされたディレクトリにファイル名がEUCのファイルを作成できるか?
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=37602&forum=12

どちらかの方法で対応したいと思っています。
あしゅ
ぬし
会議室デビュー日: 2005/08/05
投稿数: 613
投稿日時: 2007-03-29 18:37
引用:

あぶぽんさんの書き込み (2007-03-29 16:34) より:
Javaで、ファイル名のエンコードがデフォルトエンコーディング以外の場合、
そのファイルにアクセスする方法はありますか?




前の書き込みの方針でおそらく可能だと思いますが、
ちょっと設定が変わったり、何かのバージョンを更新して
挙動が変わったりすると動かなくなるかもしれません。

アブノーマルな運用の自覚と覚悟があるなら試してみましょう。
当然ながら、まともな解決策はエンコーディングを揃える事です。

NFSサーバ(Linux:EUC-JP) <-> NFSクライアント(Windows:SJIS)
という状況で両者でエンコーディングを揃えられないのであれば、
sambaにすればサーバ側で任意に変換できるので解決できますよ。
あぶぽん
大ベテラン
会議室デビュー日: 2005/10/20
投稿数: 205
投稿日時: 2007-03-29 19:20
あしゅさん、ありがとうございます。

引用:

前の書き込みの方針でおそらく可能だと思いますが、



ということは、

System.setProperty("file.encoding", "MS932");

か、

java -Dfile.encoding=MS932 XXXX

で、アクセスできるということですか?

# このプロパティはファイルの内容だけかと思っていましたが、
# ファイル名もOKなんですね

ファイルシステムがEUCでファイル名がMS932という特殊な環境ですので、
すぐにテストできる状況にはありませんが、

試して、報告いたします。
あぶぽん
大ベテラン
会議室デビュー日: 2005/10/20
投稿数: 205
投稿日時: 2007-03-29 19:56
あっ、

引用:

System.setProperty("file.encoding", "MS932");
java -Dfile.encoding=MS932 XXXX



MS932ではなくて、ISO-8859-1ですね。

なにゆえですか?
あしゅ
ぬし
会議室デビュー日: 2005/08/05
投稿数: 613
投稿日時: 2007-03-29 20:26
引用:

java -Dfile.encoding=MS932 XXXX

で、アクセスできるということですか?

# このプロパティはファイルの内容だけかと思っていましたが、
# ファイル名もOKなんですね



いや、、正直試してみないとわかりません。

どこかで変換をかけなければいけないのは確かだと思うのですが、
他に関係しそうなシステムプロパティが思いつかなかったので。

Linuxではシステムのエンコーディングは環境変数LANG以外から
取得することは基本的にできないので、その周辺を使うはずです。

別のプロパティを見ているとすれば、むしろ都合は良さそうです。
file.encodingを変えてしまうとログ等にも影響してしまうでしょうし。

引用:

あぶぽんさんの書き込み (2007-03-29 19:56) より:
MS932ではなくて、ISO-8859-1ですね。



ISO-8859-1にするのは、getBytes()後にString化する場合です。
最初のコードをそのまま使って試す場合を想定して書きました。
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2007-03-30 00:22
>java -Dfile.encoding=MS932 XXXX
>
>で、アクセスできるということですか?
確か、file.encoding はリードオンリーのシステムプロパティです。

[ メッセージ編集済み 編集者: インギ 編集日時 2007-03-30 00:22 ]

スキルアップ/キャリアアップ(JOB@IT)