windowsでgccなどのlinux用コマンドが使える環境としてMsysがありますが、最近はMsys2と呼ばれるものが出てきて、だいぶ安定して実用できる感じになってきました。
日本語もちゃんと認識できるところがいいですね。
(ただしコード表現はUTF-8ですが)
環境設定して、いろいろコンパイルできるようになったので、とりあえず環境設定のやり方などを書いていこうと思います。
##インストール
http://sourceforge.net/projects/msys2/files/Base/
より、環境にあったものをダウンロードしてください。
64BitOSならば64bit版を落としておきましょう。
(64Bit→x86_64、32Bit→i686です)
その後インストーラよりインストールすると、c:\にフォルダができてます。(64Bitならmsys64になります)
その中にあるmsys2_shell.batを動かしてシェルが動けばOKです。
一旦閉じてもう一度msys2_shell.batを動かしてから
$ pacman -Suy
としてシステム全体を更新しておきましょう。
なお、ホームディレクトリ(/home/ユーザ名)は、msys\home\以下にあります。
##初期設定など
後はお好みで...と言ったところですが、デフォルトでは必要最小限しか入ってないので、、
$ pacman -S vim gcc git gcc-libs openssh
くらいは入れておけばよいかと思います。
###各種設定
MSYS2のvimは互換モードで動いてしまいとにかく使いにくいので、最低限.vimrcは設定しておきましょう。
set nocompatible
set number
set title
set ruler
set autoindent
set smartindent
set tabstop=4
set shiftwidth=4
set noexpandtab
set backspace=indent,eol,start
set mouse=a
あと、.inputrcはデフォルトでも入力に問題がありませんでしたが、一応、Allow 8-bit input/output
とか書いてある箇所に以下を追記しておきます。
set meta-flag on
set input-meta on
set output-meta on
set convert-meta off
##ハマったこととか
msysフォルダにある mingw32_shell.bat などでシェルを動かして、これらのgccでコンパイルすると、何故かコマンドラインの引数だけがShift-JISのまま引き渡されるようになってました。
不思議なのが、cinやscanfで取ってきた標準入力からの文字列は双方ちゃんとUTF-8のまま入ってるという点です。。
これはなかなか気が付きにくいですが、いろいろ調べてみると、動かすgccやライブラリも変わってくるのが原因かなといったところでした。
(mingwxxは他のmingwプロジェクトとの互換性を重視しているから?)
msys2_shellで動かした場合、gccは/usr/bin/gcc
のものを使います。
mingw32_shellで動かすと/mingw32/bin/gcc
のものを使います。
なので、よほどのことがない限り、shellはmsys2_shellで動かしたほうが良さそうです。
もし、mingw系のシェルでやる場合は、次のようにiconvを使うような変換用のコードを入れておくと良い感じになります。
#include <string>
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <string.h>
#include <iconv.h>
// MSYS-MINGWの場合、なぜかコマンドラインだけはSJISのままなのでUTF8にコンバートする
void convargv(char *src,std::string &dest)
{
iconv_t ic = iconv_open("UTF-8", "SJIS");
char *pin=src;
char *pou;
size_t ilen = strlen(src);
// 半角かなの変換にUTF8は3オクテット必要
size_t olen = ilen*6+10;
dest.resize(olen);
pou = &dest[0];
iconv(ic,&pin,&ilen,&pou,&olen);
*pou = '\0';
iconv_close(ic);
}
using namespace std;
int main(int argc,char *argv[])
{
string outstr;
string instr;
string xstr;
convargv(argv[1],xstr);
cout << xstr << endl;
outstr = "てすとん";
cout << outstr << endl;
cout << "何か入力してください" << endl;
cin >> instr;
cout << "結果" << endl;
cout << instr << endl;
return 0;
}
gccなどでコンパイルするときは、-liconv
をオプションに追加しないとエラーになります。
それにしても江添さんも仰せの通り、iconvの関数仕様がけっこうあれなので、できればiconvは使いたくないところですね。。
本の虫:iconvがクソすぎる
http://cpplover.blogspot.jp/2012/04/iconv.html
##参考文献
MSYS2でMinGW環境整備(2)
http://arithmeticoverflow.blog.fc2.com/blog-entry-33.html