以下代码在Linux上运行正常但在OS X 10.7上引发异常:
#include <iostream>
#include <locale>
#include <stdexcept>
int main() try {
std::locale::global(std::locale(""));
std::cout << "Using locale: " << std::locale().name() << "\n";
}
catch (std::runtime_error const& e) {
std::cout << e.what() << "\n";
return 1;
}
Run Code Online (Sandbox Code Playgroud)
OS X上的输出是:
locale::facet::_S_create_c_locale名称无效
但是,标准明确地说明了这一点
该组有效的字符串参数值的是
"C",""和任何实现定义的值.
所以无论什么原因导致上述行为都违反了标准.
使用的编译器是clang ++ 3.1(tags/Apple/clang-318.0.58); 我也尝试过通过Homebrew安装的GCC 4.7,结果相同.
其他人可以验证这个问题吗?是什么导致的?我做错了吗?这是OS X中的错误吗?
(也许这与另一个xlocale问题有关,但错误实际上是完全不同的.)
我有一个简单的程序,它使用在命令行上传递给它的一系列语言环境来测试wchar_t和char之间的转换.它通过打印出语言环境名称和无法转换的字符串输出失败的转换列表.
我正在使用clang和libc ++构建它.我的理解是libc ++的命名语言环境支持由OS X上的xlocale库提供.
我看到一些意外的失败,以及转换失败的一些情况,但事实并非如此.
这是程序.
#warning call this program like: "locale -a | ./a.out" or pass \
locale names valid for your platform, one per line via standard input
#include <iostream>
#include <codecvt>
#include <locale>
#include <array>
template <class Facet>
class usable_facet : public Facet {
public:
// FIXME: use inheriting constructors when available
// using Facet::Facet;
template <class ...Args>
usable_facet(Args&& ...args) : Facet(std::forward<Args>(args)...) {}
~usable_facet() {}
};
int main() {
std::array<std::wstring,11> args = {L"a",L"é",L"¤",L"€",L"??",L"?",L"?",L"?",L"?",L"?",L""};
std::wstring_convert<usable_facet<std::codecvt_utf8<wchar_t>>> u8cvt; // …Run Code Online (Sandbox Code Playgroud)