クロスプラットフォームで開発する際のちょっとした落とし穴
MacOS(Linux)とWindows両方で動作するObjectScriptプログラムを開発する際に、よくやらかしてしまうミスを共有します。
WindowsとUNIX系のファイルシステムの1つの違いは、ディレクトリのセパレータです。
UNIX系は、/(スラッシュ)
Windows系は、\(バックスラッシュ)
です。
ファイルを読み書きするプログラムでセパレータをOS別に選択するという以下のようなコードをよく書くのですが、
if ($system.Version.GetOS() = "UNIX") {
set sep = "/"
}
else {
set sep = "\"
}
ここでこのバックスラッシュをキーボードで入力すると、日本語キーボードの場合、バックスラッシュの代わりに¥(円マーク)が入力されてしまいます。
ソースコードがSJISの場合は、これでも問題ないのですが、クロスプラットフォームで開発する場合は、UTF8で通常作成するので、Macで動かすと問題ないのにWindowsで動かすとエラーになるということがちょくちょく起こります。
そして、これは意外に間違いに気づきにくいです。
ちなみにPythonでは、どちらでも/を使っておけば問題ないので、こんな問題は起こることはないと思います。
Comments
@Hiroshi Sato さん、ありがとうございます。最近の Windows だと、以下画像のようにパスを / と書いても問題ありません。Pythonに限らず、ObjectScriptでも大丈夫です! .png)
そのため記事で書かれているように、当たり前になっているクロスプラットフォーム開発でも、パスを / に統一しておくと便利かもですね。
@Hiroshi Sato さん
「いつからか」は正確には分かりませんが、少なくとも、18年前発売の「Windows 7 + Cache 2008.2」の組み合わせで上記コードでファイルが作成されるのが確認できます。だいぶ昔から、ですね。