C语言实现UTF-8转成UTF-32

怎么用c 标准库实现将UTF-8转成UTF-32?
比如先解码然后在编成UTF-32?

有用请采纳:
在 C 语言中,可以使用 <wchar.h> 中的 mbrtowc 和 mbstowcs 函数将 UTF-8 编码的字符串转换为 UTF-32 编码的宽字符串。

mbrtowc 函数将单个 UTF-8 编码的字符转换为宽字符,而 mbstowcs 函数则将一个 UTF-8 编码的字符串转换为宽字符串。

例如:

#include <wchar.h>
#include <stdio.h>

int main() {
    const char* utf8_str = "Hello, 世界";
    wchar_t utf32_str[20];

    size_t len = mbstowcs(utf32_str, utf8_str, 20);
    if (len == (size_t)-1) {
        printf("Error converting to UTF-32\n");
        return 1;
    }

    printf("%ls\n", utf32_str);
    return 0;
}


这段代码将一个 UTF-8 编码的字符串转换为 UTF-32 编码的宽字符串并打印出来。

如果需要转换单个字符,可以使用mbrtowc,并且需要设置一个state变量来记录当前转换的状态。

#include <wchar.h>
#include <stdio.h>

int main() {
    const char* utf8_str = "Hello, 世界";
    wchar_t utf32_ch;
    mbstate_t state;
   


这段代码将一个 UTF-8 编码的字符转换为 UTF-32 编码的宽字符并打印出来。

*望采纳你可以使用c标准库中的iconv函数来实现将UTF-8转成UTF-32,它可以帮助你快速、高效地完成转换任务。
对于普通的UTF-8编码,你可以使用iconv函数将字符串转换为UTF-32编码,它以下面的语法来实现:iconv(source_string, "UTF-8", "UTF-32")。
另一种选择是使用mbstowcs函数,它可以将多字节的UTF-8编码转换成宽字符类型的UTF-32编码,具体的语法是: mbstowcs(dest, source_string, count)。

#include <stdint.h>
#include <stddef.h>

int is_valid_char(uint32_t ch)
{
    return ch < 0xd800 || ch > 0xdfff;
}


static int getch(uint8_t buf[], unsigned long *idx, size_t strlen, uint32_t *cp)
{
    int remunits;
    uint8_t nxt, msk;
    if (*idx >= strlen)
        return -1;
    nxt = buf[(*idx)++];
    if (nxt & 0x80) {
        msk = 0xe0;
        for (remunits = 1; (nxt & msk) != (msk << 1); ++remunits)
            msk = (msk >> 1) | 0x80;
    } else {
        remunits = 0;
        msk = 0;
    }
    *cp = nxt ^ msk;
    while (remunits-- > 0) {
        *cp <<= 6;
        if (*idx >= strlen)
            return -1;
        *cp |= buf[(*idx)++] & 0x3f;
    }
    return 0;
}


int utf8_to_utf32(uint8_t input[], uint32_t output[], size_t count,
                  size_t *out_size)
{
    unsigned long idx = 0;
    for (*out_size = 0; *out_size < count; ++*out_size) {
        getch(input, &idx, count, &output[i]);
        if (!is_valid_char(output[i])) {
            return -1;
        }
    }
    return 0;
}