hack のためのネタ帳, etc,,,

状況

桁区切り#2016-12-14: C++ 関連なんだけど、
Cygwin で std::locale("") とか std::locale("ja_JP.UTF-8") とかが全然通らない。
std::locale() とか std::locale("C") は通るんだけど、どうしたらいいんだこれ?

stdlocaletest.cpp

#include <iostream>
#include <locale>
#include <stdexcept>
int main()
{
  try {
    std::locale loc("");
    std::cout << loc.name() << std::endl;
  } catch (std::runtime_error &e) {
    std::cout << e.what() << std::endl;
  }
  return 0;
}

Cygwin での結果

$ locale -a | grep ja
ja_JP
ja_JP.utf8
ja_JP@cjknarrow
ja_JP.utf8@cjknarrow
$ echo $LANG
ja_JP.UTF-8@cjknarrow
$ g++ stdlocaletest.cpp && ./a
locale::facet::_S_create_c_locale name not valid
$ g++ stdlocaletest.cpp -o stdlocaletest && LANG= ./stdlocaletest
C
$ g++ stdlocaletest.cpp -o stdlocaletest && LANG=C ./stdlocaletest
C
$ g++ stdlocaletest.cpp -o stdlocaletest && LANG=ja ./stdlocaletest
locale::facet::_S_create_c_locale name not valid
$ g++ stdlocaletest.cpp -o stdlocaletest && LANG=ja_JP ./stdlocaletest
locale::facet::_S_create_c_locale name not valid
$ g++ stdlocaletest.cpp -o stdlocaletest && LANG=ja_JP.UTF-8 ./stdlocaletest
locale::facet::_S_create_c_locale name not valid

Ubuntu 16.04.4 LTS での結果

$ g++ stdlocaletest.cpp -o stdlocaletest && ./stdlocaletest
ja_JP.UTF-8
どうも Cygwin の問題には違いないんだけど、libstdc++ のコンパイルオプションの問題のようで、以下のようなポストが見つかった。

上記 stackoverflow の投稿に boost::locale::generator で locale 生成城みたいなこと書いてあるんだけど、Cygwin だと、
boost::locale::generator gen;
std::cout << gen("").name() << std::endl;
とかやって gen() に 何喰わしてやっても .name() に "*" しか返って来ないので、exception 避け以外の効果が見込めなかった。

最終手段としては libstdc++ 再コンパイル何だろうけど、それはちょっと面倒臭過ぎる。

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

Wiki内検索

フリーエリア

管理人/副管理人のみ編集できます