2011/10/07

chcp 1200(UTF-16) って使えないじゃん

 
コマンドプロンプトで UTF16 のファイル名 などを dir /b で表示して、
その値を xargs に渡そうと思っても出来ない。
 
理由は3つある。まずは コードページ 932 の為、出力やパイプが行われた
瞬間に CP932 に変換されてしまう。
 
パイプ経由でアプリケーションに渡る時点で、Windows Shift_JIS に変換される
ので、UTF16 コードのまま渡すことは不可能。また逆に考えると type コマンド
で UTF16 のファイルを表示し、それをファイルにリダイレクトしてやれば Shift_JIS のファイルを生成することも可能。
 
もう一つの理由。パイプを実装しているプログラムコードは、ほぼ全てが SJIS
前提にしているので仮に Unicode で渡されても正しく処理が出来ない
 
 
最後の理由、文字コードを chcp コマンド 1200 、 utf16 を設定するのに…
そもそも失敗する。UTF-8 の 65001 は成功する。
 
使えねぇーー。日本語版 Windows では利用できないって噂は本当かも?
 
って事で Unicode のファイル名などがあると xargs などパイプを利用した
コマンドは正しく動作しないことになります。
 
正確に言えば、以下のやり方で渡すことはできると思いますが。
 
1. chcp 65001 で UTF8 モードにして、UTF-8 の入力を受け付ける
プログラムを実装する。但しフォントが無いので画面には正しく表示できない。
 
2. chcp 932 のままで UTF-8 を渡す。UTF-8 の入力を受け付ける
プログラムを実装する。Android の adb logcat を見るに、これが
現実的?
 
2番の方法ならたぶんこんな感じ。
 
dir /b *txt | sjis2utf8 | xargs-utf8toutf16 echo
 
理論上は上の手順でいけると思う。utf-8 に変換して、次に utf-8 に対応した
xargs を渡してやれば良い。
 
イヤ…だめだ。パイプに渡される時点で UTF16 があると SJIS になるので、
そもそもの出力をUTF-8 にしてやらないとダメってことになるかも。
 
dir_utf8 /b *txt | xargs-utf8toutf16 echo
 
試して無いけど、これで行けそう?ちょっと時間を見つけたら試してみます。
 
 
いけた。これならパイプ経由で を引数として渡すことも可能だ。
コマンドを自作しなければならないという点がありますが、データを渡せる事が
重要なので、この機能は必須だな。

0 件のコメント:

コメントを投稿