WindowsとMacとLinux/FreeBSDと
はや6回目のテックブログです。
何を書こうとか悩んだのですが、セキュリティの話を書いたとして長くなってしまいます。
そこで、少しでも社内外に多少でも便利になりそうな話のほうが良いとか思い、マルチOSな環境による違いを色々と吸収しているお話を書いていこうと思い立ちました。(なお続くかどうかはわかりません)
私は、個人的にLinuxをメインのOSとして使用しており、ディストリビューションにはDebianを選んでいます。
文字コードの問題

いきなり最大の難関です。
Windowsは一般的にShift-JIS(オリジナルのCP932)という文字コードがベースになっていて、他のOSではUTF-8がベースになっています。(なおこのあたり、Windows-31J/MS932とか言い出すとキリが無くなるので割愛します)
そのため、Windows以外のOSから受け取ったzipファイルの中身に日本語のファイル名を使ったファイルが紛れ込んでいると、Windowsでは「文字化けしているー」 などと騒ぎになります。
とりあえずなんとかしたい場合
どのOSでも7-Zipをインストールしておきましょう。
たぶんこれ一つでtarやgzip形式のファイルもなんとかなりますし、7z形式にすることで、圧縮効率が良くなるというメリットもあります。
Windowsであれば右クリックからのコンテキストメニューに展開等の操作メニュー入り、割と楽に操作できます。
Macなどではbrewからコマンドライン版をインストールする以外にもThe UnarchiverをApp Storeからインストール(し、特定の拡張子のファイルをThe Unarchiverで展開ように設定)するという手もあります。(個人的にThe UnarchiverはGUIをベースとする人には使い勝手が良いとは言いづらいです…)
コマンドラインを厭わない場合
LinuxやFreeBSDでコマンドライン版7zipを使うという手もあります。これは日本語の対応も効くものの、余計な手間がかかるので、OSのパッケージシステム等でunarコマンドをいれましょう。私はもっぱらこれです。
勝手に文字コードを認識して展開してくれるので、unzip -t (ファイル名) と-tオプションを使って中身を確認し、認識できたらそのままunzipコマンドで展開し、CP932っぽいと思えばunarコマンドで展開という具合です。
WindowsでもWSL2を使うようにしてDebianとかUbuntsuを入れてしまいましょう。
RedHat系列でも入るのでしょうが公式で配布されているわけではない(がunzipは巷の独自拡張の-Oオプションでファイル名の文字コードが指定できるかも)ので、Debian系ディストリビューションのほうが面倒ではありません。
Windowsのホスト側からエクスプローラーで \\wsl$\(インストールしたディストリビューション)\home\(ユーザー名) へアクセスし、WSL2のHomeディレクトリにアクセスすれば展開したファイルを取り出すことができます。
MacのUTF-8

さて、ここですべてのベースの文字コードをUTF-8化したため快適になる…と思ったら認識が甘いです。
Windows(とLinux/FreeBSD)とMacではUTF-8が実は異なるためです。
Unicodeの文字を複数組み合わせた時の正規化した時の方式が、Macとそれ以外では違っており、UTF-8で統一したからといって楽ができるとは限りません。
ごく単純な書き方をすると、濁音・半濁音などの文字をどう扱っているか?という話になり、ファイル名の状態が
- Mac: ハ゜ヒ゛フ゜ヘ゛ホ゜
- 他:パビプベポ
という具合でファイル名を扱っているため、同じUTF-8だとしてもズレが生じます。(主にUnicodeの正規化形式の問題と言われています)
このズレが個人的にGUIのアーカイバを使わない理由の一つです。慣れもありますが修復/修正しやすい環境でもあるため、コマンドラインベースで過ごしています。
たとえば、ファイル名をコピー&ペーストする際に、Macの一部ファイルに問題が発生することがあります。
これを解決するために下記の方法が使えます。
nkfコマンドを使用する場合
nkfコマンドがある場合、NFC/NFD問題を解決するために下記のコマンドを入力します。
F=$(echo ファイル名|nkf --ic=UTF8-MAC); mv (ファイル名) $F
nkfコマンドがない場合
nkfがない場合、iconvコマンドを使います。
F=$(echo ファイル名|iconv -f utf8-mac -t utf8); mv (ファイル名) $F
このような感じで、ファイル名をMacのUTF-8からLinux等のUTF-8に変換します。
Linux系(WSL2環境を含む)の場合
Linux系(WSL2環境を含む)であれば、convmvコマンドをインストールすることで、一撃で終わらせることができます。
convmv -f utf8 --nfd -t utf8 --nfc --notest (ファイル名)
番外編
特にMacとWindowsが混在している組織では環境では文字コードの問題が頻繁に起こり、とにかく面倒です。
その対処法として、Windowsの文字コードをUTF-8化する方法があります。
※この番外編をマネをして動作的な話や別の手間が増える可能性などについては保証はしません。
Windowsの文字コードをUTF-8化する
大前提として、Windows11であること、もしくはWindows10のバージョンが21H2であることを確認してください。
正直Windowsのバージョンをサクっと調べられない方はヤメておいたほうが無難かもしれません。
個人の環境ではWindows10、Windows11ともにテストはしています。
バックアップを取っておこう
サクっといくかもしれませんが、念の為。
- Windowsキー+Rで「ファイル名を指定して実行」を開き、「sdclt」と入力します
- システムイメージバックアップでバックアップを取得します
UTF-8化する
- Windowsキー+Rで「ファイル名を指定して実行」を開き、「intl.cpl」と入力します
- 地域と言語の設定が表示されるので、「管理タブ」をクリック
- 「システムロケールの変更ボタン」をクリック
- 「ベータ: ワールドワイド言語サポートでUnicode UTF-8を使用にチェック」をし、OKを押す
- 再起動が促されるので再起動を行う
- いつもどおりにログインする
これだけでUTF-8化されます。
MacやLinux上で作られたzipファイルの中の日本語のファイル名が確認できればOKです。Macで作られれたzipファイルを扱うのであればこの方法でストレスが少なくなります。
ただし、変更後は当然ですがShift-JISの日本語ファイル名は表示できなくなります。
また、使っているプログラムの仕様によっては、「文字コードはShift-JISで扱う」場合があり、自爆する場合があります。
この方法で日本語のファイル名の問題が減ることはありますが、外部とのやりとりなどではまだ文字コードを意識しながら作業をする必要があります。
逆に、それを意識できない場合は、WindowsのUTF-8化はしないほうが良いでしょう。
まとめ
自分が普段やっていることの一部を紹介しましたが、自分はLinux環境をメインに使用しています。
Windows/Macについてはあくまで補助的な役割でそれぞれが長けている時に使っています。
環境を準備している理由は、誰かが単純に問題を解決してほしいと頼むことがあるからです。この記事を提供することで、使用者が他の人が使う環境についても少しでも配慮してくれることを期待しています。
おまけ
UNC名(Windowsでいうネットワーク上のファイル名やリソース名を指す名前)も同様にWindowsとその他で取り扱い方が違います。
そのため、私はWindowsからその他のOSへの変換スクリプトと、その他のOSからWindowsへの変換スクリプトを同時に表示し、それをチャット等にコピペできるbashスクリプトを作ってあります。
(なお引数の$1にあたる部分はシングルクオートでくくってスクリプトに渡さないとちゃんと表示してくれません。)
Windows→その他のOSの変換スクリプト
#!/usr/bin/env bash echo echo smb:${1//\//}
その他のOS→Windowsの変換スクリプト
#!/usr/bin/env bash echo P=${1#smb:} echo ${P////\}
ファブリカコミュニケーションズで働いてみませんか?
あったらいいな、をカタチに。人々を幸せにする革新的なサービスを、私たちと一緒に創っていくメンバーを募集しています。
ファブリカコミュニケーションズの社員は「全員がクリエイター」。アイデアの発信に社歴や部署の垣根はありません。
“自分から発信できる人に、どんどんチャンスが与えられる“そんな環境で活躍してみませんか?ご興味のある方は、以下の採用ページをご覧ください。