处理不区分大小写而不考虑区域设置

Pat*_*ick 5 c++ windows case-insensitive visual-studio

我正在研究我的应用程序中不区分大小写的处理方式。到目前为止,我意识到有两种不同的情况:

\n\n
    \n
  1. 数据向用户可视化
  2. \n
  3. 数据在内部处理
  4. \n
\n\n

对于情况 1,您应该始终使用用户的区域设置。这意味着,例如,当对列表中的项目进行排序时,并且您希望不区分大小写地进行排序,那么您应该使用区域设置感知的不区分大小写的字符串比较函数。

\n\n

对于情况 2,您不想使用用户的区域设置似乎是合乎逻辑的,因为如果您的用户使用不同的区域设置,但仍然使用相同的数据集,这可能会产生不良影响(例如,如果您正在管理图书馆软件,则可以使用书籍的名称作为数据库中书籍实例的键,并且希望处理这种不区分大小写的情况(我知道这是一种简化))。

\n\n

当使用 STL 容器(如 std::map)时,我注意到将键设置为大写,然后对大写的搜索值执行查找会更有效。这比在地图上循环时执行不区分大小写的比较更有效。对于 std::unordered_map 可能需要执行这样的技巧。

\n\n

然而,我意识到这也可能会产生奇怪的效果,我想知道Windows(也使用不区分大小写的文件名)如何处理这些情况。

\n\n

例如,德语字符 \xc3\x9f (ringel-S) 在大写时写为 SS。这似乎暗示 \xc3\x9f.txt 和 SS.txt 应该表示相同的文件,因此 \xc3\x9fs.txt 和 s\xc3\x9f.txt 以及 sss.txt 和 SSS.txt 也应该表示相同的文件文件。但根据我的实验,Windows 中似乎并非如此。

\n\n

所以我的问题是:

\n\n
    \n
  • 应使用哪些 C++ 和/或 Windows 函数来执行与区域设置无关、不区分大小写的字符串比较?
  • \n
  • 应该使用哪些 C++ 和/或 Windows 函数来使字符串不区分大小写(例如,将其设置为大写),以便在 std::map 中执行查找时比较效率更高(或者甚至在使用 std::map 时使散列成为可能) ::无序_地图)?
  • \n
  • 关于内部(即非可视化相关)数据的不区分大小写字符串处理的任何其他经验(或文档链接)?
  • \n
\n