◆ パイプで iconv つないで変換するしかいい方法なさそう

たまにネットがつながらなくて
ipconfig /flushdns

とか
ipconfig /renew

とかするのですが たまたまそこにコマンドプロンプトじゃなくて msys のウィンドウがあったのでそっちでやりました


すると

文字化け!


コマンドプロンプトは SJIS で msys は UTF-8 がデフォルトの文字エンコーディングです
コマンドプロンプト用のコマンドでは SJIS で日本語出力されるので msys 側で表示しようとするとおかしくなるようです

chcp

コマンドプロンプトとエンコーディングといえば chcp とかいうのがあったような

試す用に SJIS と UTF-8 の文字を出力するプログラムを作ります
楽につくれる PHP にしました
<?php

echo mb_convert_encoding('sjisです。', 'SJIS', 'UTF-8');
echo PHP_EOL;
echo 'utf8です。';
echo PHP_EOL;

PHP 自体は UTF-8 なので SJIS 化して出力とそのまま出力しています


普通に実行
C:\Users\user\Desktop>php a.php
sjisです。
utf8縺ァ縺吶€

もちろん UTF-8 のほうが文字化けですね


chcp すると
chcp 65001
Active code page: 65001

C:\Users\user\Desktop>php a.php
sjis�ł��B
utf8です。

UTF-8 が見えて SJIS が文字化けになりました


ということは msys で SJIS に chcp すれば見れそう
でも chcp ってそれ以降全体が変わるし exe ファイル呼び出すというより コマンドプロンプト自体の組み込み機能みたいな気がするし msys で動くのかな?

とか考えていると それ以上に重要なことに気づきました

これだとできても ipconfig とか SJIS のもの実行する度に切り替えないとじゃん!!
しかも自分でこれは 切り替え必要とか覚えないといけないし

chcp 65001 で ipconfig すると

ちょっと話がそれますが chcp 65001 の状態で SJIS が出力される ipconfig すると文字化けするのかな と気になって試してみると

なんと英語メッセージになりました

なるほど 英語だとエンコーディング関係ないです

msys でも utf-8 判断して英語にしてくれればいいのですけど

iconv

色々と試したり調べたりしてみましたが 結局出力に対して変換を書けるのが一番の方法のようです
@echo off
%~1 | iconv -f SJIS -t UTF-8

こんな bat ファイルを用意して コマンドを実行すると  | (パイプ) で icon に出力が流れて UTF-8 に変換してくれて出力されます

コマンドごとにこれを通さないといけないかの判断はやっぱり必要なままです
とりあえず出力はこれでいいとして入力ってどうなるんだろう?




続きました
コマンドプロンプトと msys の入力エンコーディングはこっちの記事