哪个 C 函数可以将 À、É 转换为小写 à、è?
我尝试了 tolower() 和 towlower(),但都不起作用。
您可以使用towlower功能:
/* towlower example */
#include <stdio.h>
#include <wctype.h>
#include <wchar.h>
#include <stddef.h>
#include <locale.h>
int main () {
setlocale(LC_CTYPE, "");
int i=0;
wchar_t str[] = L"À TÉst String.\n";
wchar_t c;
while (str[i]) {
c = str[i];
putwchar (towlower(c));
i++;
}
return 0;
}
输出是:
à tést string.
"" 空名称表示根据环境变量选择语言环境。
您在这里面临的实际问题*(尽管前面有“答案”),是您有一个Unicode字符串。*(或者,至少,某种 DBCS = “双字节字符集”。)
“C”语言的标准函数是“在更早、更简单的时间”设计的,其中唯一需要考虑的语言表示是ASCII
,它将“需要表示的每个字符”分配到一组 127 个可能的值。这张照片中没有任何“变音标记”,例如这些。在那些简单的时代,“1 个字节 = 1 个字符”。
为了表示“真正的人类(!)语言字符”,有必要采用一种更加灵活的编码格式,可以将 1 到 4 个字节分配给单个“字符”。(而且,请注意,关于“确切如何做到这一点”的共识并不是一夜之间形成的!)无论如何,您现在在这里使用的“原始”库例程不是“Unicode 感知的”。(它们从未被设计成,现在也不能改装......)相反,必须使用替代功能。
这是一个很好的外部网页,它很好地总结了使用 C 和 C++ 时需要考虑的各种问题:
http://www.cprogramming.com/tutorial/unicode.html
---编辑:
当我说,“关于如何做到这一点的共识并不是在一夜之间发生的”,我的评论旨在产生潜在的深远(!)影响。“为什么即使在今天也有必要说"encoding=UTF-8"
?这就是为什么。“如何解释多国字节序列的单一解释”从未发展过,尤其是“C”语言,“把它放在下巴上。”在今天的“C”运行时中,您可能需要使用不止一套完整的库函数,以便正确处理您的数据。