如何使用 mblen()?

pou*_*ler 5 c

这是一些测试代码,可以帮助我理解多字节字符管理。

\n\n
#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n\nint main(int argc, char *argv[]) {\n    char * line = malloc(1024);\n    size_t n;\n\n    getline(&line, &n, stdin);\n    while (*line) {\n        int offset = mblen(line, strlen(line));\n        if (offset == -1) return 0;\n        printf("%d\\n", offset);\n        line += offset;\n    }\n    return 0;\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

据我了解,如果用户在哪里输入“\xc3\xa9l\xc3\xa9phant”,我的输出应该显示 2 1 2 1 ...\n但是,它从第一个字节开始显示 -1 表示 mblen 错误.\n我收集到这可能是这两行代码中的错误,我必须做什么,我可以阅读哪些资源,才能获得有关此处发生的情况的提示?\n当然是 printf("%s", line )会(并且确实)完美地工作。

\n

use*_*653 4

将我的评论变成答案。

详细信息可能取决于您的确切执行环境,但我认为以下内容应该适用于大多数 *NIX 系统。

mblen取决于当前区域设置

该函数的行为受当前语言环境的 LC_CTYPE 类别影响

启动时的默认区域设置是“C”区域设置(请参阅 参考资料setlocale),它可能与您期望的不匹配。您可以方便地调用setlocale(LC_CTYPE, "")将语言环境设置为“本机”环境。

请注意,调用setlocale(LC_ALL, "")(正如我最初写的那样)的更改可能超出您的预期,因此请务必在执行此操作之前阅读所有与语言环境相关的内容。