当前位置: 首页 > news >正文

utf8转utf16

参考在线字符编码转换工具.qr9.netmain.cpp/** * https://qr9.net/string-encoding */#includestdio.h#includestdint.h#includestring.h#includewindows.h/** * UTF-8 到 UTF-16 (无 BOM, 小端) 转换函数 * * 返回值: 实际写入 utf16_buf 的字节数 (不含空终止符) * 注意: 不支持 4 字节 UTF-8 序列 (U10000 以上)遇到时跳过 */uint32_tutf8_to_utf16_le(constuint8_t*utf8_str,uint8_t*utf16_buf,uint32_tbuf_size){uint32_tutf8_index0;uint32_tutf16_index0;while(utf8_str[utf8_index]!\0){uint32_tcodepoint0;uint8_tbyteutf8_str[utf8_index];// 1. 解析 UTF-8 码点if((byte0x80)0){// 单字节: 0xxxxxxx (U0000 ~ U007F)codepointbyte;utf8_index1;}elseif((byte0xE0)0xC0){// 双字节: 110xxxxx 10xxxxxx (U0080 ~ U07FF)uint8_tb1utf8_str[utf8_index1];if((b10xC0)!0x80){// 续字节非法含提前遇到 \0 的情况跳过首字节utf8_index1;continue;}codepoint((byte0x1F)6)|(b10x3F);utf8_index2;}elseif((byte0xF0)0xE0){// 三字节: 1110xxxx 10xxxxxx 10xxxxxx (U0800 ~ UFFFF, 含常用中文)uint8_tb1utf8_str[utf8_index1];uint8_tb2utf8_str[utf8_index2];if((b10xC0)!0x80||(b20xC0)!0x80){utf8_index1;continue;}codepoint((byte0x0F)12)|((b10x3F)6)|(b20x3F);utf8_index3;}else{// 4 字节序列或非法字节跳过utf8_index1;continue;}// 2. 过滤代理码点 (UD800 ~ UDFFF)这些码点在 UTF-16 中非法if(codepoint0xD800codepoint0xDFFF){continue;}// 3. 输出 UTF-16 LE (此处 codepoint 必定 0xFFFF)if(utf16_index2buf_size){break;}utf16_buf[utf16_index](uint8_t)(codepoint0xFF);// 低字节utf16_buf[utf16_index](uint8_t)((codepoint8)0xFF);// 高字节}// 4. 写入 UTF-16 空终止符 (占 2 字节)if(utf16_index2buf_size){utf16_buf[utf16_index]0x00;utf16_buf[utf16_index1]0x00;}returnutf16_index;// 返回写入字节数不含终止符}/** * 单个 Unicode 码点 → UTF-16 LE * * param codepoint Unicode 码点 (U0000 ~ UFFFF, 不支持代理对范围) * param utf16_buf 输出缓冲区至少 4 字节 (2字节数据 2字节终止符) * param buf_size 缓冲区大小 * return 写入字节数 (不含终止符)码点非法或缓冲区不足返回 0 */uint32_tcodepoint_to_utf16_le(uint32_tcodepoint,uint8_t*utf16_buf,uint32_tbuf_size){// 拒绝代理码点和 BMP 以上的码点if(codepoint0xD800codepoint0xDFFF)return0;if(codepoint0xFFFF)return0;if(buf_size4)return0;utf16_buf[0](uint8_t)(codepoint0xFF);utf16_buf[1](uint8_t)((codepoint8)0xFF);utf16_buf[2]0x00;utf16_buf[3]0x00;return2;}// 辅助函数以十六进制形式打印内存数据voidprint_hex(constchar*label,constuint8_t*data,uint32_tlen){printf(%s (Len: %d): ,label,len);for(uint32_ti0;ilen;i){printf(%02X ,data[i]);}printf(\n);}intmain(){SetConsoleOutputCP(CP_UTF8);uint8_tutf16_buffer[64];// --- 测试1: 字符串转换 ---constchar*test_str你好;memset(utf16_buffer,0,sizeof(utf16_buffer));print_hex(UTF-8 ,(constuint8_t*)test_str,strlen(test_str));uint32_tlenutf8_to_utf16_le((constuint8_t*)test_str,utf16_buffer,sizeof(utf16_buffer));print_hex(UTF-16 LE ,utf16_buffer,len);printf(\n);// --- 测试2: 单码点转换 ---// U4F60 你, U0041 A, U00E9 éuint32_tcodepoints[]{0x4F60,0x0041,0x00E9};constchar*labels[]{U4F60 (你),U0041 (A),U00E9 (é)};for(inti0;i3;i){memset(utf16_buffer,0,sizeof(utf16_buffer));lencodepoint_to_utf16_le(codepoints[i],utf16_buffer,sizeof(utf16_buffer));printf(Codepoint %-16s - ,labels[i]);print_hex(UTF-16 LE,utf16_buffer,len);}return0;}输出C:\Users\PC\CLionProjects\untitled28\cmake-build-debug\untitled28.exe UTF-8(Len:6): E4 BD A0 E5 A5 BD UTF-16 LE(Len:4):604F 7D59Codepoint U4F60(你)-UTF-16 LE(Len:2):604F Codepoint U0041(A)-UTF-16 LE(Len:2):4100 Codepoint U00E9(é)-UTF-16 LE(Len:2): E9 00 Process finished withexitcode0
http://www.rkmt.cn/news/1398414.html

相关文章:

  • 别再只用简单线了!用QGIS箭头符号让你的河流、管网数据流向一目了然
  • 从Blender到Unity:手把手教你搞定模型导入、骨骼绑定与蒙皮动画(附避坑清单)
  • 数据采集卡也能当示波器:触发模式与记录仪的底层玩法
  • 别再只跑udhcpc了!深入解读BusyBox DHCP客户端的工作流程与default.script的幕后作用
  • 使用taotoken cli工具一键配置团队多成员的开发环境
  • 手把手教你用CMP Facade数据集做图像修复:从下载到实战(含云盘链接)
  • 用SPSSAU做Dagum基尼系数分析:手把手教你分解中国各省人均GDP的区域差异
  • 从I²t曲线到温升降额:手把手教你用Littelfuse数据手册精准计算Fuse熔断时间
  • 牛顿法工程实践:从收敛失效到鲁棒求解的四步闭环
  • 别再让主进程摸鱼了!聊聊并行遗传算法中‘富农+长工’模式的性能提升
  • 从功放到调音台:手把手拆解电位器在音频电路里的6种经典玩法(附电路图)
  • 布隆过滤器:从位图到布谷鸟的演进之路——缓存穿透的终极防线
  • 新手也能懂:PX4固定翼姿态控制器,从手动飞行到串级PID的保姆级拆解
  • 别再乱用-ss和-t了!FFmpeg裁剪视频时顺序放错,小心时长对不上(附正确用法)
  • 避坑指南:在Ubuntu 22.04上用Scala 2.12.17跑通第一个程序,我踩了这些权限和路径的坑
  • 别再手动拧绳子了!用3DMAX的Rope插件提升场景细节的真实感(2015-2024版通用)
  • 从零打包一个Ubuntu软件:详解deb包里那个必不可少的control文件怎么写
  • 手把手教你用STM32看懂充电桩的‘暗号’:从CP信号到充电引导的完整解析
  • 告别‘command not found’:一份覆盖Debian、Ubuntu、Alpine的Linux网络与进程诊断工具安装指南
  • Linux内核启动探秘:Ramdisk从编译、解压到挂载的完整生命周期剖析(含源码导读)
  • Unity ShaderGraph Input节点实战:用UV和Time节点5分钟做出流动水面效果
  • VMware vCenter磁盘空间管理的‘潜规则’:/storage下log、core、archive目录的日常维护与自动化清理方案
  • 别再乱焊了!HC-SR501人体感应模块的光敏电阻,实测告诉你到底该用多大的(附电路图分析)
  • 保姆级教程:用Python搞定ScanNet数据集的下载、解析与可视化(避坑指南)
  • 别再只调包了!用fetch_20newsgroups数据集实战文本分类,从数据清洗到模型评估的完整流程
  • Unity编辑器Selection系统深度解析与避坑指南
  • SAP MIRO发票校验时,如何用增强LMR1M001自动拦截供应商信息错误?
  • 当每一行代码都可能是“AI代笔”:你会为“零AI介入”的汽车支付溢价吗?
  • QMCDecode终极指南:免费快速解锁QQ音乐加密格式的完整教程
  • 祛魅与归真:论贾子理论作为宇宙本源真理的非叙事性本质