-- hello.pl -------------- use utf8; print "こんにちは、世界♥"; -------------------------- > perl hello.pl Wide character in print at hello.pl line 2. 縺薙s縺ォ縺。縺ッ縲∽ク也阜笙・
-- hello.pl -------------- use utf8; binmode(STDOUT,":encoding(cp932)") ; print "こんにちは、世界♥"; -------------------------- > perl hello.pl "\x{2665}" does not map to cp932. こんにちは、世界\x{2665}
-- hello.pl -------------- use utf8; use Win32::Unicode::Console; printW "こんにちは、世界♥"; -------------------------- > perl hello.pl Can't locate Win32/Unicode/Console.pm in @INC (@INC contains: C:/strawberry/perl/site/lib C:/strawberry/perl/vendor/lib C:/strawberry/perl/lib .) at hello.pl line 2. BEGIN failed--compilation aborted at hello.pl line 2.
> cpan install Win32::Unicode::Console (途中省略) Result: FAIL Failed 1/27 test programs. 3/284 subtests failed. dmake.exe: Error code 255, while making 'test_dynamic' XAICRON/Win32-Unicode-0.38.tar.gz C:\STRAWB~1\c\bin\dmake.exe test -- NOT OK //hint// to see the cpan-testers results for installing this module, try: reports XAICRON/Win32-Unicode-0.38.tar.gz Stopping: 'install' failed for 'X/XA/XAICRON/Win32-Unicode-0.38.tar.gz'.
Perl6ちょおすごい (スコア:5, 参考になる)
日本語のhello, worldが普通に表示できる! (なおソースファイルの文字コードはUTF-8)
日本語のファイル名が普通に開ける!
これ [qiita.com]
さっきから何を当たり前のことで感動してるんだとか何がすごいのかわからないとか思った人は幸せです。きっとWindowsのPerl 5で日本語 [developers.srad.jp]を扱ったことがないのでしょう。
惜しむらく
Re:Perl6ちょおすごい (スコア:1)
ちなみに最初のhello, worldサンプルをPerl 5で書こうとするとこうなる。
まずは、perlintro [perl.org]のサンプルの文字列を日本語に置き換えるという、誰でも考えつきそうなところから始めてみよう。
なんか文字化けした。ちなみにOS XやLinuxだと文字化けしないので、以下の様なことに悩まされるのは実質Windowsユーザーだけだし、他環境からソースを移植するときはこういう手抜き記述が残っていないかソース全体を目を皿のようにして探さなければならない。
文字列は♥を含むので、ソースコードをCP932で保存することはできない。調べてみると、文字列リテラルをUTF-8で書くにはuse utf8;が必要なようだ。
文字化けが解消しない上になんか変なメッセージが出た(このメッセージがなんなのかはもちろん知っているが、初学者という設定だったらそう思っても不思議はない)。
さらに調べると、内部表現の文字列を出力するときはまずエンコードする必要があるようだ。
変なメッセージは消えたが、まだ文字化けが解消しない。
さらに調べると、WindowsはシフトJISのOSで、しかもCP932とかいうMicrosoft独自の方言を使っているらしい(という知ったかぶり解説に騙されている人が多いようだが、これは嘘八百。まあWin9xの時代は正しかったんだけどね)。
なんかまた変なメッセージが出る上に♥がまだ出力できない。Encode信者の皆様におかれましては、♥をどうすればEncodeで出力できるかぜひ教えていただきたいもんだ。実際にこれで困った経験のないエアユーザーに期待するだけ無駄だろうけど。
さらに調べると、Win32::Unicode::Consoleというモジュールを使えばUnicode文字を出力できるようだ。
おっとWin32::Unicode::ConsoleはStrawberry Perlの標準モジュールじゃないのか。
ようやくまともに出力できたけど、ソースコードはWin32以外の環境への移植性が全くない。ちなみにWin32::Unicode::Nativeというモジュールを使うと、見かけ上printでUnicode文字列を出力しているようなソースが書けるけど、Win32::Unicode::Nativeがオーバーライドする関数は内部表現の文字列を引数に取る仕様であるのに対して、普通のソースでは(本当は)まずエンコードする必要があるので。やっぱり移植性がない。ていうか見かけで区別できなくなるだけたちが悪い。まあ個人的にはどうせWindowsしか使わないから移植性には目をつぶるとしよう。
Strawberry Perlの新しいバージョンが出たのでインストールした。モジュールはインストールし直しになる。
なんかテストに失敗してインストールできないんだが。これのせいでStrawberry Perl 5.16より新しいバージョンにできなくて、せっかくPerl 5.20で導入されたsignaturesも試せない。マジ困ってるんだけど、なんとかしてくれませんかね(バグ報告はもちろんしたが、年単位で放置されているのでWin32::Unicode::Consoleの開発者はもう興味を失っているようだ)。まあエアユーザーに期待するだけ(以下略
Re: (スコア:0)
>年単位で放置されているのでWin32::Unicode::Consoleの開発者はもう興味を失っているようだ
Windowsから脱出しちゃったのかもね
過去との互換性のために出来ないんだろうけどWindowsもマルチバイト環境をUTF-8に移行してくれたらいいのにな。
Re: (スコア:0)
https://github.com/bokutin/strawberry-perl-USING_WIDE-revival [github.com]
Re: (スコア:0)
ちなみに、が、だいぶ長い。
不精なので読めないわ…
不精なので日本語がダメだったら英語使いますわ。