C 中将 UTF8 4 字节字符串转换为 UTF16 字符串的算法

问题描述 投票:0回答:1

我需要在 C 中将 UTF8 4 字节字符串转换为 UTF16 字符串。
我不允许使用任何外部库来支持它。我已经定义了一个宏来支持 UTF8 3 字节到 UTF16 的转换

#define UTF8-3BYTE-TO-UCS16(char1,char2,char3) ((((char1) & 0x0F) << 12) | (((char2) & 0x3F) << 6) | ((char3) & 0x3F))

我也在寻找 UTF8 4 字节的类似实现。

utf-16 utf8mb4
1个回答
0
投票

UTF-8 将 Unicode 字符编码为 1-4 个字节。基本上,UTF-8 4字节序列结构如下:

11110xxx 10xxxxxx 10xxxxxx 10xxxxxx  

其中

x
代表实际 Unicode 字符的一点。

UTF-8 4 字节序列被转换为 UTF-16 作为一对代理字符。

你可以从UTF-8序列中提取Unicode代码,然后检查代码点是否在BMP(Basic Multilingual Plane)范围内,如果在则可以用单个UTF-16代码单元来表示它,但是如果不是,则计算高代理和低代理:

#define UTF8_4BYTE_TO_UTF16(char1, char2, char3, char4) \
    uint32_t codePoint = (((char1 & 0x07) << 18) | \
                          ((char2 & 0x3F) << 12) | \
                          ((char3 & 0x3F) << 6)  | \
                          (char4 & 0x3F)); \
    uint16_t highSurrogate, lowSurrogate; \
    if (codePoint <= 0xFFFF) { \
        /* BMP character, can be represented directly in UTF-16 */ \
        highSurrogate = (uint16_t)codePoint; \
    } else { \
        /* Calculate surrogates for non-BMP character */ \
        codePoint -= 0x10000; \
        highSurrogate = (uint16_t)((codePoint >> 10) + 0xD800); \
        lowSurrogate = (uint16_t)((codePoint & 0x3FF) + 0xDC00); \
    } \

请记住,该宏使用中间 32 位和 16 位变量,并且您必须确保这些变量在函数中正确声明,否则您必须相应地调整宏。

© www.soinside.com 2019 - 2024. All rights reserved.