C++ 在不考虑区域设置的情况下处理案例不敏感

C++ 在不考虑区域设置的情况下处理案例不敏感,c++,windows,visual-studio,case-insensitive,C++,Windows,Visual Studio,Case Insensitive,我正在调查我的申请中对案件不敏感的处理。到目前为止,我意识到有两种不同的情况: 数据对用户是可视化的 数据由内部处理 对于案例1,您应该始终使用用户的区域设置。这意味着,例如,在对列表中的项目进行排序时,如果希望不区分大小写,则应使用区分区域设置、不区分大小写的字符串比较函数 对于案例2,您不想使用用户的区域设置似乎是合乎逻辑的,因为如果用户使用不同的区域设置,但仍然使用相同的数据集,这可能会产生不良影响(例如,如果您正在管理库软件,您可以使用图书的名称作为数据库中图书实例的键,并希望处理不区分

我正在调查我的申请中对案件不敏感的处理。到目前为止,我意识到有两种不同的情况:

  • 数据对用户是可视化的
  • 数据由内部处理
  • 对于案例1,您应该始终使用用户的区域设置。这意味着,例如,在对列表中的项目进行排序时,如果希望不区分大小写,则应使用区分区域设置、不区分大小写的字符串比较函数

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

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

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

    例如,德语字符ß(ringel-S)在大写时写为SS。这似乎意味着ß.txt和SS.txt应该表示同一个文件,因此ßS.txt和Sß.txt以及sss.txt和sss.txt也应该表示同一个文件。但在我的实验中,Windows中似乎不是这样

    所以我的问题是:

      哪些C++和/或Windows函数应该用于执行与区域无关的大小写不敏感字符串比较?
    • 应该使用哪些C++和/或Windows函数来减少一个字符串的情况(例如,把它放在大写字母中),那么在执行STD::map(甚至使用STD::无序的映射)时,比较可能更有效吗?
    • 关于内部(即非可视化相关)数据的不区分大小写字符串处理的任何其他经验(或文档链接)

    对于(源),不区分大小写的比较使用通过转换的大写名称。就此函数而言,“ß”已经是大写的,因为它将单个字符映射到单个字符,而不是多个字符。但甚至标记为转换“ß”使用
    LCMAP_UPPERCASE | LCMAP_language_case
    仍然无法将其升格为“SS”。微软表示,NTFS文件系统有一个$upcase元文件,“将小写字符转换为匹配的Unicode大写字符”。不知道什么API将访问它,也不知道如何和何时设置此表,也不知道其他文件系统和网络访问。但是,文件系统决定不区分大小写的应用,而不是用户的区域设置,这是有意义的。@Stein此表是在格式化卷AFAIK时创建的,在不同的Windows版本中可能不相同。