-- 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]を扱ったことがないのでしょう。
惜しむらくは、コマンドラインからUnicode文字列を受け取れないこと。
世界に愛を込めようとしたら世界に疑問を抱いてしまった。
あとuse v5;での動作を確認したかったけど(正直Perl6の文法を今さら覚える気になれなかったので)タレコミに書いたとおりモジュールのインストールがまともにできないので確認できませんでした。願わくはバグ互換性を窓から投げ捨てて普通に日本語が使えるようになっていてほしいのだけど。
Re:Perl6ちょおすごい (スコア:1)
IRCに接続したけど脳や目が英語を精読することを拒否したから何が
最新ニュースなのかわからずじまいだったけどそういうことか。。。
IRCのテンプレ的なstatusログにヘルプが記述されていて
Hello, World
としきりに促していたような心当たりならある。
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)
ちなみに、が、だいぶ長い。
不精なので読めないわ…
不精なので日本語がダメだったら英語使いますわ。
Re: (スコア:0)
> > perl6 hello.pl
> こんにちは、世界♥
中には誰もいませんよ。
#この小箱の中に小人さんが入って、彼等が頑張って翻訳してるわけじゃないのです。
Re: (スコア:0)
惜しむらくは、コマンドラインからUnicode文字列を受け取れないこと。
Windowsでperl5使ってる者だが、結局なんじゃないかと。
一つ目と二つ目はUTF8な文字列(perl5だとutf8フラグ付き)でもSTDOUTへの出力の際にcp932に変換してくれているように見える。
二つ目は更にファイルシステムの読み込みの際も変換かけてくれているのかな。
その癖、最後のを見るとSTDINからは駄目。
というかWindowsだからと勝手に変換かけられても困るのだがね。実行はcmd.exeだけじゃないのよ。
Encodeかますのが面倒は解るが、実装が中途半端な方がもっと面倒じゃないか。
単なる不具合で修正されるというならともかく、幻滅もんじゃないか、これ。
Re:Perl6ちょおすごい (スコア:2, 参考になる)
> 一つ目と二つ目はUTF8な文字列(perl5だとutf8フラグ付き)でもSTDOUTへの出力の際にcp932に変換してくれているように見える。
CP932に♥は含まれていないからそれはありえない。もしcp932に変更されているなら3つ目のように?に変換されて出力されるはず。だからWin32::Unicode::Consoleのように、最終的にWriteConsoleWを使っているはず。わざわざサンプルに♥を含めたのはそれを確認するため。
> 二つ目は更にファイルシステムの読み込みの際も変換かけてくれているのかな。
これも違う。コマンドラインから渡せなかったのでわかりにくくなってるけど、たとえば
とすれば、ちゃんとUnicode文字を含むファイルを開ける。つまりWin32::Unicode::Fileのように最終的にCreateFileWを呼び出している。
単にcp932に変換している程度だったらここまで感動していないよ。
> その癖、最後のを見るとSTDINからは駄目。
あのーSTDINとコマンドライン引数の区別もついてないんですか?
とりあえずこれ [stackoverflow.com]で確認。
STDINはちゃんとUnicode文字にも対応している。
コマンドライン引数が対応していないのは確かに残念だけど、Perl 5のように修正不可能な根本的な制約ではないから修正の望みがある。
> というかWindowsだからと勝手に変換かけられても困るのだがね。実行はcmd.exeだけじゃないのよ。
WindowsのコンソールAPIでやり取りする限りPowerShellでもbashでも同じだよ。と思ったけどperl6のブートストラップはバッチで実装されてるから今のところCMDからじゃないと実行できねえぞ。UNIXの実装(UNIXではシェルスクリプトをブートストラップにすることはよくある)を単純に移植したからこうなるんだな。やっぱWindowsは開発環境として軽視されてるな。
これはさすがにちょっとアレだが、個人的にはCMDしか使わないから問題ない。
> Encodeかますのが面倒は解るが、実装が中途半端な方がもっと面倒じゃないか。
面倒ってのは理由の一部にすぎない。そもそもEncodeを使う限りUnicode文字に対応できない中途半端な処理しかできない。Win32::UnicodeやWin32::Longnameを使えば移植性がなくなる。つーかリンク先の記事 [developers.srad.jp]に全部書いてあるから読んでくれないかな。
> 単なる不具合で修正されるというならともかく、幻滅もんじゃないか、これ。
Perl 5の根本的な欠陥(文字列が内部表現かどうかPerl側で識別することができないのでそれを管理する手間を短気で無精で傲慢なプログラマー様に押し付けている)だけど、互換性の理由からPerl 5で修正されることはありえないことがわかってるから喜んでるんしuse v5;に期待してるんだよ。
Re: (スコア:0)
> perl6のブートストラップはバッチで実装されてるから今のところCMDからじゃないと実行できねえぞ。UNIXの実装(UNIXではシェルスクリプトをブートストラップにすることはよくある)を単純に移植したからこうなるんだな。やっぱWindowsは開発環境として軽視されてるな。
この件だけど、ビルドガイドにPowerShell上でビルド方法も書かれていたから、PowerShell上でビルドすればcmdlet版のperl6ができるんじゃないかな(未確認)。
CygwinやMinGW上でビルドできるかどうかは知らないけど、そもそもCygwinのPerl 5はUnicode文字も普通に使えるから問題ない(なぜCygwin Perlを使わないのかもリンク先 [developers.srad.jp]に書いてある。UNIX likeに閉じた環境ならCygwinもいいけどね)。