Strawberry Perlで日本語ファイル名を扱う

| コメント(0)

Strawberry PerlもActivePerlも CP932 で表せない日本語ファイルを扱うのには一工夫必要です。

ここでは Win32::Unicode を使ってみます。
作者様の詳しい 文章 がありますので、下ではサンプルを行なってみました。

備考

Windowsにはファイルを扱うためのAPIとして CreateFileA と CreateFileW が用意されています。
CreateFileAは渡されたファイル名を、通常CP932として扱かいます。(現在のコードページに依存)
CreateFileWは渡されたファイル名を、UTF-16LEとして扱います。

上記の例の「萌え♥.txt」はCP932では表せないので、最終的にCreateFileAが呼ばれる場合は問題が起きます。Strawberry PerlとActivePerlのopenがそうです。
Win32::Unicodeでは最終的にCreateFileWを呼ぶので正しく「萌え♥.txt」を扱えます。

他の処理系

  • Strawberry PerlとActivePerl
    openはCreateFileA、Win32::UnicodeはCreateFileW
  • CygwinのPerl
    openでCreateFileWが使えます。
  • Python 2.7.1 (r271:86832, Nov 27 2010, 18:30:46) [MSC v.1500 32 bit (Intel)] on win32
    open(u'萌え♥.txt', 'w') で正しく扱えました。
  • ruby 1.9.1p243 (2009-07-16 revision 24175) [i386-mingw32]
    下記では正しく扱えないようです。
# -*- encoding: utf-8 -*-
file = File.open("萌え♥.txt", "w")

コメントする