utf8字符截取,来自ds

73 阅读1分钟

在 UTF-8 编码中,一个字符(Unicode 码点)可能由 1~4 个字节组成,因此不能像 ASCII 那样直接按字节截取。以下是不同编程语言中安全提取 UTF-8 字符的方法:


1. UTF-8 字符的字节结构

UTF-8 是变长编码,首字节的高位标识字符占用的字节数:

首字节范围字节数Unicode 码点范围
0x00 ~ 0x7F1U+0000 ~ U+007F (ASCII)
0xC2 ~ 0xDF2U+0080 ~ U+07FF
0xE0 ~ 0xEF3U+0800 ~ U+FFFF
0xF0 ~ 0xF44U+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; }

验证工具

echo -n "你好" | hexdump -C  # 查看UTF-8原始字节