gpt4 book ai didi

c++ - 视觉 C++ : buggy towupper

转载 作者:太空宇宙 更新时间:2023-11-04 11:40:03 24 4
gpt4 key购买 nike

给定以下代码:

#include <iostream>
#include <cwctype>
#include <clocale>

int main()
{
wchar_t c = L'\u00ff'; // ÿ LATIN SMALL LETTER Y WITH DIAERESIS
// → 0178 Ÿ latin capital letter y with diaeresis

std::cout << std::hex << std::showbase;
#ifdef WIN32
const char * lcc = setlocale(LC_ALL, "English");
#else
const char * lcc = std::setlocale(LC_ALL, "en_US.cp1252");
#endif
if(lcc) {
std::cout << "set locale: " << lcc << std::endl;
std::cout << "towupper(" << (std::wint_t)c << ") = " << towupper(c) << '\n';
} else {
std::cout << "failed to set locale" << std::endl;
}
}

如果我在 Visual Studio 2010(也是 2013)中编译并运行它,结果是:

set locale: English_United States.1252
towupper(0xff) = 0x9f

在带有 gcc 的 Linux 上:

set locale: en_US.cp1252
towupper(0xff) = 0x178

towupper 的结果在两个平台上是不同的,linux/gcc 给出的答案对我来说似乎是正确的,因为 0x178 (Ÿ) 是 0xff (ÿ) 的正确大写 Unicode 代码点。

但是,0x9f 也是 Ÿ 的代码点,但在使用的 Windows-1252 代码页中。所以看起来 Visual C 的 towupper 会将输入视为窄字符,并根据预设代码页对其进行解释。

根据我的理解,宽字符应始终被解释为 Unicode 代码点,在 Windows/VC 上为 UTF-16,在 Linux/gcc 上为 UTF-32。我在这里错了,还是它真的是 Microsoft 实现中的错误?还是在这种情况下只是规范不够严格,两者都可以被视为正确的结果?

最佳答案

从问题的评论来看,似乎没有“真正”的解决方案; C 或 C++ 标准在字符编码方面不够严格,因此我们不能对区域设置敏感的结果抱有真正的期望。

对于我在 Windows 上的特定用例,CharUpperW 被证明是一个可行的选择,尽管它依赖于平台。

关于c++ - 视觉 C++ : buggy towupper,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21721884/

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