UTF8を表示するコマンドプロンプトを作ってみた
■目的
WindowsでPythonとかを使っているとUTF8の文字が化けて出力されて厳しいので、コマンドプロンプトの出力をUTF8に変換するコマンドプロンプトもどきをつくってみた。

ばけちゃっている日本語が・・・
b0232065_14551822.png


ちゃんと表示されるよ、ジョニー!
b0232065_14572678.png

上のほうのテキストボックスにコマンドプロンプトに発行したい命令を入力してEnterキーを押すと結果がかえってくる。

■ダウンロード
http://needtec.sakura.ne.jp/testprog/Utf8Cmd.zip
 Windows7 64bitの32bitアプリケーションで動作確認

■制限
 ・標準出力とエラー出力をUTF8にしているだけだから、普通のコマンドプロンプトで表示される日本語はばける
 ・標準入力をUTF8でやるのはむりでした。

■別解
 「コマンドプロンプト と UTF8」FineView Software Labs様より



■解説
・C#のコードからcmd.exeを起動します。
・起動したプロセスの標準出力とエラー出力を非同期に取得するようにしてます。
 OutputDataReceived 、ErrorDataReceived
・また、標準出力とエラー出力はUTF8で表示するようにしときます。
・起動したプロセスのStandardInputを使用してテキストにいれたコマンドをcmd.exeに渡してます。


フォームのコード

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Diagnostics;
namespace Utf8Cmd
{
public partial class frmMain : Form
{
static frmMain frmTarget = null;
private System.Diagnostics.Process proc = null;

public frmMain()
{
InitializeComponent();
frmTarget = this;
this.proc = new Process();
this.proc.StartInfo.FileName = System.Environment.GetEnvironmentVariable("ComSpec");
this.proc.StartInfo.UseShellExecute = false;
this.proc.StartInfo.RedirectStandardOutput = true;
this.proc.StartInfo.RedirectStandardInput = true;
this.proc.StartInfo.RedirectStandardError = true;
this.proc.StartInfo.CreateNoWindow = true;
this.proc.StartInfo.Arguments = "";
this.proc.OutputDataReceived += OutputHandler;
this.proc.ErrorDataReceived += ErrorHandler;
this.proc.StartInfo.StandardErrorEncoding = Encoding.UTF8;
this.proc.StartInfo.StandardOutputEncoding = Encoding.UTF8;
this.proc.Start();
this.proc.BeginOutputReadLine();
this.proc.BeginErrorReadLine();
}
public void OutputText(string msg, Color c )
{
this.txtOutput.SelectionColor = c;
this.txtOutput.SelectedText = msg + "\r\n";
this.txtOutput.ScrollToCaret();
}
private void btnInput_Click(object sender, EventArgs e)
{
this.txtOutput.Text = "";
string cmd = this.txtInput.Text + "\r\n";
this.proc.StandardInput.WriteLine(cmd);
/* 標準出力に強引にUTF8書き込んでもしても結局化ける
* ex ああああ... OK
* あああ ... NG ああぁE となる
byte[] buf = System.Text.Encoding.UTF8.GetBytes( cmd);

this.proc.StandardInput.BaseStream.Write( buf, 0, buf.Length);
this.proc.StandardInput.Flush();
*/
this.txtInput.SelectAll();
}

private void txtInput_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == System.Windows.Forms.Keys.Enter)
{
btnInput_Click(null, null);
}
}

public delegate void OutputTextDelegate(string msg,Color c);
static void OutputHandler(object o, DataReceivedEventArgs args)
{
Console.WriteLine(args.Data);
frmTarget.Invoke(new OutputTextDelegate(frmTarget.OutputText), args.Data, Color.Black);
}

static void ErrorHandler(object o, DataReceivedEventArgs args)
{
Console.WriteLine(args.Data);
frmTarget.Invoke(new OutputTextDelegate(frmTarget.OutputText), args.Data, Color.Red);
}
private void frmMain_Load(object sender, EventArgs e)
{

}
}
}

[PR]
by mima_ita | 2013-05-30 15:13 | .NET
<< さくらレンタルサーバーにGra... ExcelVBAのDoxygen出力 >>



実験ですお
検索
カテゴリ
最新の記事
.NET4.5におけるasy..
at 2014-07-02 00:46
.NETでTwitterを検..
at 2014-06-29 00:49
Redmineのプラグインで..
at 2014-06-28 03:29
IO.popenのwrite..
at 2014-06-28 03:25
RedmineのWikiでU..
at 2014-06-28 03:16
以前の記事
最新のトラックバック
その他のジャンル
ブログパーツ