先日、FreeBSD 10.0-RELEASEが登場しました(参考: SourceForge.JP Magazine)。今回、大きな変更点としてClangとlibc++の標準採用があります。これにより、以下のプログラムが動作するようになりました。

// c++ helloworld.cppまたはclang++ helloworld.cpp
 
#include <iostream>
 
int main()
{
  std::wcout.imbue(std::locale(""));
  std::wcout << L"こんにちは、世界" << std::endl;
}

ただし、これが動くのはLANG=ja_JP.UTF-8の場合のみでした。ja_JP.eucJPでは、コンパイル時に“error: illegal character encoding in string literal”と言われ、それを回避しても実行時にセグメンテーションフォルトになります。

今まで使われてきたlibstdc++は、std::localeが”C”しか使えませんでした。libstdc++でロケールが完全に使えるのはglibc使用時のみ、すなわち実質的にGNU/Linuxくらいのものでした。

これに対し、libc++はxlocale(jmanxxx_l系関数)などを使用しています。このため、UTF-8でしか動かないということは原理上なく、今後直す余地があります。

以上、FreeBSD 10.0からは標準でstd::localeが使えるようになるという話でした。

スポンサード リンク

この記事のカテゴリ

  • ⇒ FreeBSD 10.0はstd::localeが使えるようになった(FreeBSD 10.0-RELEASE登場記念)
  • ⇒ FreeBSD 10.0はstd::localeが使えるようになった(FreeBSD 10.0-RELEASE登場記念)