在 UTF-8 编码中,一个字符(Unicode 码点)可能由 1~4 个字节组成,因此不能像 ASCII 那样直接按字节截取。以下是不同编程语言中安全提取 UTF-8 字符的方法:
1. UTF-8 字符的字节结构
UTF-8 是变长编码,首字节的高位标识字符占用的字节数:
| 首字节范围 | 字节数 | Unicode 码点范围 |
|---|---|---|
0x00 ~ 0x7F | 1 | U+0000 ~ U+007F (ASCII) |
0xC2 ~ 0xDF | 2 | U+0080 ~ U+07FF |
0xE0 ~ 0xEF | 3 | U+0800 ~ U+FFFF |
0xF0 ~ 0xF4 | 4 | U+10000 ~ U+10FFFF |
#include <stdio.h> #include <stdint.h>
void print_utf8_char(const char *str) { while (*str) { uint32_t code = 0; if ((*str & 0x80) == 0) { // 1字节 code = *str++; } else if ((*str & 0xE0) == 0xC0) { // 2字节 code = ((*str++ & 0x1F) << 6) | (*str++ & 0x3F); } else if ((*str & 0xF0) == 0xE0) { // 3字节 code = ((*str++ & 0x0F) << 12) | ((*str++ & 0x3F) << 6) | (*str++ & 0x3F); } else if ((*str & 0xF8) == 0xF0) { // 4字节 code = ((*str++ & 0x07) << 18) | ((*str++ & 0x3F) << 12) | ((*str++ & 0x3F) << 6) | (*str++ & 0x3F); } printf("U+%04X ", code); } }
int main() { print_utf8_char("你好😊"); // 输出 U+4F60 U+597D U+1F60A return 0; }
验证工具
-
在线调试:使用 UTF-8 编码查看器 分析字节序列。
-
命令行:
bash
echo -n "你好" | hexdump -C # 查看UTF-8原始字节