-1

哪个 C 函数可以将 À、É 转换为小写 à、è?

我尝试了 tolower() 和 towlower(),但都不起作用。

4

2 回答 2

2

您可以使用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.

> AC 程序在启动时继承其语言环境变量
> 启动。这会自动发生。但是,这些变量不会
> 自动控制库函数使用的语言环境,
> 因为 ANSI C 规定所有程序默认以标准
> `C' 语言环境启动。要使用环境指定的语言环境,您必须
> 调用 setlocale。调用如下:
>>
setlocale(LC_ALL, "");

"" 空名称表示根据环境变量选择语言环境。

于 2016-07-18T03:53:39.013 回答
1

您在这里面临的实际问题*(尽管前面有“答案”),是您有一个Unicode字符串。*(或者,至少,某种 DBCS = “双字节字符集”。)

“C”语言的标准函数是“在更早、更简单的时间”设计的,其中唯一需要考虑的语言表示是ASCII,它将“需要表示的每个字符”分配到一组 127 个可能的值。这张照片中没有任何“变音标记”,例如这些。在那些简单的时代,“1 个字节 = 1 个字符”。

为了表示“真正的人类(!)语言字符”,有必要采用一种更加灵活的编码格式,可以将 1 到 4 个字节分配给单个“字符”。(而且,请注意,关于“确切如何做到这一点”的共识并不是一夜之间形成的!)无论如何,您现在在这里使用的“原始”库例程不是“Unicode 感知的”。(它们从未被设计成,现在也不能改装......)相反,必须使用替代功能。

这是一个很好的外部网页,它很好地总结了使用 C 和 C++ 时需要考虑的各种问题:

http://www.cprogramming.com/tutorial/unicode.html

---编辑: 当我说,“关于如何做到这一点的共识并不是在一夜之间发生的”,我的评论旨在产生潜在的深远(!)影响。“为什么即使在今天也有必要说"encoding=UTF-8"这就是为什么。“如何解释多国字节序列的单一解释”从未发展过,尤其是“C”语言,“把它放在下巴上。”在今天的“C”运行时中,您可能需要使用不止一套完整的库函数,以便正确处理您的数据。

于 2016-07-18T03:54:33.857 回答