「windows acvtiveperl の 5c問題解決」

      2017/08/04

[windows acvtiveprerl の [5c(\)] 問題回避について」、普通?の人は、あんまり関係ないが、書いておく。。。
1 私のパソコン環境は、以下の通り
os : Windows 10 Home Premium Searvice Pack 1 64bit
perl: ActivePerl 5.22.1_2201(x86:64bit)
2 問題・事象
・相変わらず ActivePerl(5.22.1_2201)でも「5c(\)」の問題は解消されていない。。。
・特に「chdir(“表”) 」等、ディレクトリ移動(chdir)がこけるのは、どうにかしたい。。。
3 原因
・Windows は[Windows XP]の頃から、内部コードが[utf16-le] となっていた。。。
・ActivePerl が [utf16-le] に対応していない?ため、日本語shift-jis?の[\x5c]は[\]と解釈し、chdir(表)をスルーする。。。
4 参考にしたものは、以下のとおり。
1) [http://blog.livedoor.jp/xaicron/archives/50743603.html]
[http://blog.livedoor.jp/xaicron/tag/Win32API]
「コマンドプロンプトでUnicodeを扱う Win32::Unicode(0.98) モジュール書いた」
2) [http://code.activestate.com/lists/perl-libwin32/%3c20060127024017.21625.qmail@lists.develooper.com%3e/]
「SUCCESS (mostly): Win32 API, wide / unicode filenames, FindFirstFileW, FindNextFileW」
3) [http://search.cpan.org/~jenda/Win32-FileOp-0.14.1/FileOp.pm]
「package Win32::FileOp;」

スポンサードリンク

4) Win32 API Declarations for Win32Perl [1997/08/25/]ころ
旧 Nifty FGALTS MES 7|9 (Perlの部屋)メンバー方たちのログ
5 作成理由 win32::unicode;Ver0.38 というモジュールで回避できていたのだが、activeperl 5.163 までしかインストール出来なかったため、ActivePerl のヴァージョンアップができなかった。。
6 方針
・しょうがないので、見よう見まねでも?回避する。
・ディレトリや、ディレトリに関するファイルの入出力は、[perl win32::API]を使用し、[kernel32.dll]の[windows関数]は[ANSI版]ではなくて[Unicode版]を使用する。
・文字コードは、スクリプト側は[utf-8]で書き、os 側への命令(コマンド)文字コードは[utf16-le] で行う。
・コンソール側へは、[shift-jis]にする。
**言うのは簡単だが、実装するのは、半年以上かかった。(現在修正中。。)
7 実装コマンド
・ディレクトリ関係
opendir_U,readdir_U,closedir_U,chdir_U
SetCurrentDirectory_U
GetCurrentDirectory_U
・ファイル関係
Attributes_U, ->attributes_U,
CreateFile_U, ->open_U
ReadFile_U, ->while() -> @str = read_U;while(<@str>)
WriteFile_U, ->print_U
[SetFilePointer_End],
DeleteFile_U, ->unlink_U
Rename_U, ->rename_U
8 感想
* これで、だいたい、解消されつつある。
9 注意?
[use of uninitialized value pack at c-perl-site-lib-win32-api-struct.pm]等とコンソールに表示されるのは、「仕様」のようだ。
[c:\perl/site/lib/win32/api/struct.pm]の340行目付近に
# Pack() on a new struct, without slice set,
# will cause lots of uninit warnings,
# sometimes its intentional to set up buffer recipients for a future UnPack()
等と書いてある。。。
もし表示させたくないなら、[c:\perl-site-lib-win32-api-struct.pm]の
use strict; ->#use strict;
use warnings; ->#use warnings;
とコメントアウトすれば、表示しなくなる。
スポンサードリンク

 - ソフト・プログラムの支援 ,