簡體   English   中英

如何在C語言中使用strxfrm?

[英]how to use strxfrm in C language?

我問一個問題,知道C中“strxfrm”的用法。

我知道該函數是根據當前的語言環境配置轉換字符串。

但我不知道“變換”是什么,以及這個函數如何變換。

例如,我在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版本中,這顯然是一個長期存在的錯誤/缺陷/不一致/怪異/無論如何。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM