質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

Q&A

1回答

8294閲覧

convmvを用いてファイル名をcp932からutf8へ変更する方法

hirdd

総合スコア50

MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

0グッド

0クリップ

投稿2017/01/02 08:58

convmvを用いてファイル名をcp932からutf8へ変更する際につまずいています。
例えば、以下のようにmacOSにおいて、あ.txtがあるとします。

XXXXXXXX $ ls
あ.txt
XXXXXXXX $

これをmvconvを用いて、cp932に変更しようとすると、以下のように成功します。

XXXXXXXX $ convmv -f utf8 -t cp932 ./あ.txt --notest
mv "./あ.txt" "./??.txt"
Ready! I converted 1 files in 0 seconds.
XXXXXXXX $ ls
%82%A0.txt
XXXXXXXX $

しかし、これを cp932に戻そうとすると上手くいきません。。。

XXXXXXXX $ convmv -f cp932 -t utf8 ./%82%A0.txt --notest
Ready! I converted 0 files in 0 seconds.
XXXXXXXX $ ls
%82%A0.txt
XXXXXXXX $

使い方が間違っているのでしょうか??誰かご存知の方、ご教授いただけますか??

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

macOSでは、ファイル名の文字コードをcp932などにすることはできません。

macOSで標準のHFS+またはHFSXファイルシステムでは、ファイル名の文字コードにUTF-8しか使えません (より正確に言うと、修正NFDで正規化したUTF-8しか使えない。詳細はTN1150: HFS Plus Volume Formatの説明を参照)。ほかの文字コードのファイル名を作ること (名前を変えることも含む) はできません。作ろうとしたファイル名に正しくないバイトがあると、「%xx」(xxは2桁の16進数) に置換されます。

ご質問では、ファイル名をまずcp932によるものに変えようとしたため、正しくないバイトが置換されました。この結果、cp932によるファイル名ではなく、元のファイル名とも異なるが、システム的には正しいファイル名として受け入れられるものになりました。


なお、置換されてしまったファイル名ですが、convmv--unescapeオプションを使っても元に戻すことはできません。--unescapeと-f、-tを一緒に指定することはできないためです。convmvを改造したり、mvなどでひとつひとつ戻すなどする必要があります。

(上記、間違った記述を修正しました)


(追記)

convmvはもともとUnix系のOSで使うことを想定して作られたと思われます。Unix系ではファイルシステムの文字コードについて統一した決まりはなく、様々な文字コード (日本語では、BSD、Solaris、Linuxなどは主にEUC-JP、AIXはShift_JIS、など) が使われてきました。近年ではUTF-8を使うものが多くなってきています。またWindowsではANSIコードページ (日本語ではcp932) が使われます。

Unix系のファイルシステムでは従来、どんな文字コードのファイル名も特に制限なく作れていたため、異なる文字コードのファイル名がひとつのファイルシステムに混在するということが起こり得ました。convmvはこの「どんな文字コードのファイル名も作れる」ということを逆手に取って、ファイル名の文字コードをユーザが決めたものに直そうとするツールです。

macOSもUnix系のOSではあるのですが、ファイルシステムで文字コードを限定しているため、他の文字コードのファイル名はつくれません。ですので、macOS上でconvmvを (特に改造せずに) 使える場面はあまりないと言えます。

投稿2017/01/03 09:07

編集2017/01/08 04:57
ikedas

総合スコア4227

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hirdd

2017/01/07 16:26

コメントありがとうございます。 $ convmv --unescape -f cp932 -t -t utf8 %82%A0.txtを試して見たところ、以下のようになってしまい、ファイル名を元に戻す事ができませんでした。。。 $ convmv --unescape -f cp932 -t -t utf8 %82%A0.txt No charset conversion when unescaping! $ 何かやり方が悪いのでしょうか??
hirdd

2017/01/07 16:32

また、macOS標準でのファイルシステムにおいて、cp932でファイル名を保存する事はできない事は理解できたのですが、例えば、Windowsでzipしたファイルをmacで開こうとすると、%XXの羅列したファイルになると思うのですが、この場合、どのようにして直したら良いでしょうか??(convmvに限定した場合) 以下で直せると思っていたのですが、上手くいきませんでした。。。 convmv -f cp932 -t utf8 "windowsでzipした後macで解凍したファイル"
ikedas

2017/01/08 00:48

すみません。これは私の間違いで、--unescapeと-f、-tを一緒に指定することはできないですね。なので、convmvを使って元に戻す方法はないということになります。mvなどでひとつひとつ戻すしかないかと。
hirdd

2017/01/08 03:35

ご回答ありがとうございます。--unescapeについては、理解しました。 >>convmvを使って元に戻す方法はないということになります。 これは、windowsでzipされた事が原因で、macOS上で解答した後、文字化けしたものについても、convmvでは直せないという事でしょうか??
ikedas

2017/01/08 05:00

回答に追記しました。convmvを改造するか、convmvなども参考にお望みの機能を実現するプログラムを書けば、できると思います。
hirdd

2017/01/10 08:26

丁寧に説明して頂いてありがとうございます。このような経緯があったのですね。理解できました。ちなみにikedasさんは、windowsでzipされたものを解凍する時はどうされていますか??
ikedas

2017/01/10 08:44

展開した上で、その場でPerlのワンライナーを実行してファイル名を直しています。「プログラムを書けば」と言っていますが、まだ書いていないので、そういうプログラムがあればやってくれるようなことを毎回コマンドラインで書いています (そして作業が終わるとまた書くのを忘れる)。
hirdd

2017/01/15 02:36

ご回答ありがとうございます。 まずは、アプリを使用せずに、コマンドで変換したいと思って、いろいろ探しているところでした。そのPerlのワンライナーを教えて頂くことは可能でしょうか??いろいろ質問してすみません。
ikedas

2017/01/15 04:07

convmvのソースを参考に考えてみては……。 ある日に書いたものは、こんなのだったと思います。 perl -MEncode=from_to -we '$old=$_=shift; s/%([0-9A-F]{2})/chr hex "0x$1"/egi; from_to($_, "cp932", "utf-8", 1); rename $old, $_ or die $!' ファイル名 その場かぎりのワンライナーですから、おかしな結果になることもありえます。別のワンライナーで、正しく変換できるかを確認してから実行したほうがよいでしょう。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問