g++で日本語を使う in Windows7+Cygwin

日本語の取り扱いって面倒くさいことこの上ないという印象で、今まではpython使えばいいやって思ってたのですが、やっぱり使い慣れたc++でも使えるようにしたいと思い、ちょっと調べてみた。

環境

OS : Windows 7 Professional 64bit
cygwin上の設定

$ locale
LANG=C.UTF-8
LC_CTYPE="C.UTF-8"
LC_NUMERIC="C.UTF-8"
LC_TIME="C.UTF-8"
LC_COLLATE="C.UTF-8"
LC_MONETARY="C.UTF-8"
LC_MESSAGES="C.UTF-8"
LC_ALL=
$ g++ -v
Using built-in specs.
Target: i686-pc-cygwin
Configured with: /gnu/gcc/releases/respins/4.3.4-4/gcc4-4.3.4-4/src/gcc-4.3.4/co
nfigure --srcdir=/gnu/gcc/releases/respins/4.3.4-4/gcc4-4.3.4-4/src/gcc-4.3.4 --
prefix=/usr --exec-prefix=/usr --bindir=/usr/bin --sbindir=/usr/sbin --libexecdi
r=/usr/lib --datadir=/usr/share --localstatedir=/var --sysconfdir=/etc --infodir
=/usr/share/info --mandir=/usr/share/man -C --datadir=/usr/share --infodir=/usr/
share/info --mandir=/usr/share/man -v --with-gmp=/usr --with-mpfr=/usr --enable-
bootstrap --enable-version-specific-runtime-libs --with-slibdir=/usr/bin --libex
ecdir=/usr/lib --enable-static --enable-shared --enable-shared-libgcc --disable-
__cxa_atexit --with-gnu-ld --with-gnu-as --with-dwarf2 --disable-sjlj-exceptions
 --enable-languages=ada,c,c++,fortran,java,objc,obj-c++ --disable-symvers --enab
le-libjava --program-suffix=-4 --enable-libgomp --enable-libssp --enable-libada
--enable-threads=posix --with-arch=i686 --with-tune=generic --enable-libgcj-subl
ibs CC=gcc-4 CXX=g++-4 CC_FOR_TARGET=gcc-4 CXX_FOR_TARGET=g++-4 GNATMAKE_FOR_TAR
GET=gnatmake GNATBIND_FOR_TARGET=gnatbind --with-ecj-jar=/usr/share/java/ecj.jar

Thread model: posix
gcc version 4.3.4 20090804 (release) 1 (GCC)

いつUTF-8にしてたかわからないけど、たぶんcygwin導入時にShift-JIS(CP932)と選べた気がする。

「C.UTF-8」ってなんだろ?って思って調べてみたら、どうもギリシャ語周りの扱いがちょっと違うみたい。
一般的に「ja_JP.UTF-8」とするのがいいと思うけど、cygwin標準がそうなってるみたいなので、そのままにする。

g++で日本語を使う

使うときは、main関数の開始直後に「setlocale(LC_CTYPE, "");」でロケール設定できるみたい。
文字列はstringの代わりにwstring、文字(列)リテラルは最初にLをつけて「L"こんなかんじ"」。

//test.cc(utf8n-big5)
// UTF-8 BOM付はコンパイルできなかった
#include <iostream>
#include <locale>
#include <vector>
using namespace std;

void func(){
  wcout << L"こんちわ!" << endl;
}

int main(){
  setlocale(LC_CTYPE, "");
  
  vector<wstring> v;
  v.push_back(L"こんにちは");
  v.push_back(L"ご飯がすべて");
  v.push_back(L"イイネ!");

  for(int i=0; i<v.size(); i++){
    wcout << v[i].length() << ": " << v[i] << endl;
    if(v[i][0] == L'こ'){
      wcout << L"最初は「こ」!" << endl;
    }
  }
  
  func();
  
  return 0;
}
# 実行結果
$ g++ test.cc
$ ./a.out
5: こんにちは
最初は「こ」!
6: ご飯がすべて
4: イイネ!
こんちわ!

できた:)
半角とかも全部1文字とカウントされてるところをみると、EUC-JPみたいな検索のときにたまたま別な部分が引っ掛かるとかもないと思う。
とりあえずこれでc++でも日本語が使える!!