我需要在 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-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 位变量,并且您必须确保这些变量在函数中正确声明,否则您必须相应地调整宏。