微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在默认的 C++ 语言环境中,toupper() 转换了哪些字符?

如何解决在默认的 C++ 语言环境中,toupper() 转换了哪些字符?

使用认的“C”语言环境,只有 a-z 被 std::toupper() 转换,如 here 所记录的那样。 std::ctype<CharT>::toupper() 使用认 C++ 语言环境准确转换了哪些字符?

我之所以这么问是因为 std::toupper(L'ω',std::locale::classic()) 在 Windows 上返回 L'Ω',我想知道 C++ 语言环境还为哪些其他字符返回大写形式。在“C”语言环境中,不会转换相同的字符:static_cast<wchar_t>(std::towupper(static_cast<std::wint_t>(L'ω'))) 按预期返回 L'ω'

我使用以下程序来验证这一点:

#include <cwctype>
#include <fstream>
#include <locale>

int main()
{
  std::wofstream fs("out.txt");
  fs.imbue(std::locale("en_US.UTF8"));
  fs << L"std::toupper(L'ω',std::locale::classic()): " << std::toupper(L'ω',std::locale::classic()) << std::endl;
  fs << L"static_cast<wchar_t>(std::towupper(static_cast<std::wint_t>(L'ω'))): "
     << static_cast<wchar_t>(std::towupper(static_cast<std::wint_t>(L'ω'))) << std::endl;

  return 0;
}

使用 Visual Studio 2019 编译(使用 UTF-8 编码保存源文件添加编译器开关 out.txt)并在 Windows 10 上执行时 /utf-8内容

std::toupper(L'ω',std::locale::classic()): Ω
static_cast<wchar_t>(std::towupper(static_cast<std::wint_t>(L'ω'))): ω

使用 gcc 8.4.0 版 (Ubuntu 8.4.0-1ubuntu1~18.04) 输出

std::toupper(L'ω',std::locale::classic()): ω
static_cast<wchar_t>(std::towupper(static_cast<std::wint_t>(L'ω'))): ω

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。