WindowsはPowerShellを使ってもUTF-8が使えないのか…という諦め

@nqounetです.

今日,PowerShellで使える環境を整えた(つもりの)WindowsマシンでPerlで書いたテストを実行してみたんですよ.

そしたら文字化け!

UTF-8のこの時代に,まだ文字化けで悩まなければならないことが本当に辛い.

思ったよりも苦労した(思い出せなかった)のでメモ.

Term::EncodingとEncode

さすがにEncodeは忘れませんが,Term::Encodingが出てこなくて困りました.

Term::Encodingはターミナルの文字コードを返してくれます.

うまく行ったコードは,結局のところ超基本形でした.

1
2
3
4
use Encode;
use Term::Encoding qw(term_encoding);
my $enc = Encode::find_encoding(term_encoding);
print $enc->encode("ハローワールド!");

実は,役に立ったのは自分の記事(というか,自分で書いた記事を意識して検索したんですが)でした.

基本はこれで,必要な出力に対して「encode」してやることで文字化けが解消されました.

binmodeがうまく使えなかった

結論が出たところで,思考を追っていきます.

最初はPerl入学式でも使ったお約束を利用した方法で,自動的にEncodeとDecodeを行う方法を試したのですが,残念ながらテストの出力には効果がありませんでした.

書き方がまずかったのかもしれませんが.

1
2
3
binmode STDIN  => ':encoding(shiftjis)';
binmode STDOUT => ':encoding(shiftjis)';
binmode STDERR => ':encoding(shiftjis)';

shiftjisがcp932だったら違うのかもしれませんが後の祭り.

何故うまくいかないのかを考えるよりは,さっさとWindowsのせいにして次に進むほうが良さそうだと思いました.

find_encodingが思い出せなかった

次の案としては,地道に出力時にencodeしてやる方法です.

Encode::encodeは,通常,文字コードを指定してやる必要がありますが,予めfind_encodingしておくと,Encodeモジュール内で文字コードを調べる必要がなくなり,高速化が図れます.

ターミナルのコードは途中から変わることはないので,最初にterm_encodingで取得しておき,それを元にEncode::find_encodingでencodeするオブジェクトを作っておけば,文字化けせずに表示されるということです.

comments powered by Disqus
Hugo で構築されています。
テーマ StackJimmy によって設計されています。