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")
コメントする