gpt4 book ai didi

c++ - xlocale 在 OS X 上坏了吗?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:45:29 25 4
gpt4 key购买 nike

我有一个简单的程序,它使用在命令行上传递给它的一系列语言环境来测试 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) << '\n';
}
}
}

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

下面是一些正确输出的例子

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 系统的问题。 bug report将不胜感激!

关于c++ - xlocale 在 OS X 上坏了吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9451419/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com