OS X上的xLocale崩溃了吗? [英] xlocale broken on OS X?

查看:41
本文介绍了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; // wchar_t uses UCS-4/UTF-32 on this platform

    int convert_failures = 0;
    std::string line;
    while(std::getline(std::cin,line)) {
        if(line.empty())
            continue;

        using codecvt = usable_facet<std::codecvt_byname<wchar_t,char,std::mbstate_t>>;
        std::wstring_convert<codecvt> convert(new codecvt(line));

        for(auto const &s : args) {
            try {
                convert.to_bytes(s);
            } catch (std::range_error &e) {
                convert_failures++;
                std::cout << line << " : " << u8cvt.to_bytes(s) << '
';
            }
        }
    }

    std::cout << std::string(80,'=') << '
';
    std::cout << convert_failures << " wstring_convert to_bytes failures.
";
}

以下是一些正确输出的示例

en_US.ISO8859-1 : €
en_US.US-ASCII : ✈

以下是意外输出的示例

en_US.ISO8859-15 : €

ISO 8859-15字符集中确实存在欧元字符,因此应该不会失败。

以下是我期望但未收到的输出示例

en_US.ISO8859-15 : ¤
en_US.US-ASCII : ¤
这是ISO 8859-1中存在的货币符号,但已被删除,并替换为ISO 8859-15中的欧元符号。此转换应该不会成功,但没有发出错误信号。在进一步检查此案例时,我发现在这两种情况下‘’都被转换为0xA4,这是‘’的ISO 8859-1表示。

我没有直接使用xLocale,只是通过libc++间接使用。Mac OS X上的xLocale仅仅是被糟糕的地区定义打破了吗?有没有办法解决这个问题?还是我看到的问题是其他原因造成的?

推荐答案

我怀疑您看到了xLocale系统的问题。Abug report将不胜感激!

这篇关于OS X上的xLocale崩溃了吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆