gpt4 book ai didi

c - C语言中如何使用strxfrm?

转载 作者:太空狗 更新时间:2023-10-29 15:31:19 25 4
gpt4 key购买 nike

我问一个问题,想知道“strxfrm”在C中的用法。

我知道函数是根据当前语言环境配置转换字符串。

但是我不知道“transform”是什么,也不知道这个函数是怎么转换的。

例如,我在 macOS 中尝试了如下代码:

#include <stdio.h>
#include <string.h>
#include <locale.h>

int main(int argc, char * argv[])
{
char str1[512] = { 0x68, 0x6c, 0x61, 0x76, 0x61, 0x00 }; //"hlava";
char str2[512] = { 0xc4, 0x8d, 0xc3, 0xad, 0xc5, 0xa1, 0x6e, 0xc3, 0xad, 0x6b, 0x00 }; //"číšník";
char xfm1[512] = { '\0', };
char xfm2[512] = { '\0', };
char * result = NULL;
size_t lxfm1 = 0;
size_t lxfm2 = 0;

result = setlocale(LC_ALL, "en_US.UTF-8");
lxfm1 = strxfrm(xfm1, str1, sizeof xfm1);
lxfm2 = strxfrm(xfm2, str2, sizeof xfm2);
printf("<en-US>\n");
printf("setlocale = \"%s\"\n", (result == NULL) ? "NULL" : result);
printf("str1: \"%s\" --> \"%s\"\n", str1, xfm1);
printf("str2: \"%s\" --> \"%s\"\n", str2, xfm2);
printf("strcmp(str1, str2) = %d\n", strcmp(str1, str2));
printf("strcmp(xfm1, xfm2) = %d\n", strcmp(xfm1, xfm2));
printf("strcoll(xfm1, xfm2) = %d\n", strcoll(str1, str2));
printf("returns of strxfrm: %zu / %zu\n", lxfm1, lxfm2);

result = setlocale(LC_ALL, "cs_CZ.UTF-8");
lxfm1 = strxfrm(xfm1, str1, sizeof xfm1);
lxfm2 = strxfrm(xfm2, str2, sizeof xfm2);
printf("<cs-CZ>\n");
printf("setlocale = \"%s\"\n", result);
printf("str1: \"%s\" --> \"%s\"\n", str1, xfm1);
printf("str2: \"%s\" --> \"%s\"\n", str2, xfm2);
printf("strcmp(str1, str2) = %d\n", strcmp(str1, str2));
printf("strcmp(xfm1, xfm2) = %d\n", strcmp(xfm1, xfm2));
printf("strcoll(xfm1, xfm2) = %d\n", strcoll(str1, str2));
printf("returns of strxfrm: %zu / %zu\n", lxfm1, lxfm2);

return 0;
}

我预计“strcmp(xfm1, xfm2)”的结果是正整数,因为字符“č”在捷克语中位于“h”之前。

然而,结果是……

<en-US>
setlocale = "en_US.UTF-8"
str1: "hlava" --> "001Z001^001S001h001S0000001Z001^001S001h001S"
str2: "číšník" --> "0042003_0042001`003_001]0000008?003_009S001`003_001]"
strcmp(str1, str2) = -92
strcmp(xfm1, xfm2) = -3
strcoll(xfm1, xfm2) = -152
returns of strxfrm: 44 / 52
<cs-CZ>
setlocale = "cs_CZ.UTF-8"
str1: "hlava" --> "001Z001^001S001h001S0000001Z001^001S001h001S"
str2: "číšník" --> "0042003_0042001`003_001]0000008?003_009S001`003_001]"
strcmp(str1, str2) = -92
strcmp(xfm1, xfm2) = -3
strcoll(xfm1, xfm2) = -152
returns of strxfrm: 44 / 52

我对“strxfrm”这个函数有误解吗?其实,我到现在也不清楚'转化'是什么意思。

请让我知道该函数的正确用法和用途。

最佳答案

您对 strxfrm 的用法是正确的。问题在于 Mac OS X(和 FreeBSD)语言环境的实现。它根本无法与 UTF-8 一起正常工作。这显然是这些操作系统使用的 libc 版本中长期存在的错误/缺陷/不一致/怪癖/任何问题。

关于c - C语言中如何使用strxfrm?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51943128/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com