在网上找了个ucs2转utf8的C语言实现, 看他写的代码超级麻烦。虽然同样是实现了转换。
我这里提供一个比较经典的实现转换的函数, 用到的技术主要是位操作符号。该函数来自于
公司内部人员的一个模块。 写的非常棒, 就拿出来共享一下了。
在开始写之前还是附带上一些utf8与ucs2的资料, 方便理解该转换的宏模块
以下是从一些网站截取的一些基础资料
=======================================================================
1.什么是UCS和ISO10646?
国际标准ISO10646定义了通用字符集(Universal Character Set, UCS). UCS是所有其它字符集标准的一个超集,它保证也其它字符集双向兼容,即编码间相互转换不会丢失任何信息。UCS字符集U+0000到U+007F与US-ASCII是一致的
2.什么是UNICODE
历史上, 有两个独立的, 创立单一字符集的尝试. 一个是国际标准化组织(ISO)的 ISO 10646 项目, 另一个是由(一开始大多是美国的)多语言软件制造商组成的协会组织的 Unicode 项目. 幸运的是, 1991年前后, 两个项目的参与者都认识到, 世界不需要两个不同的单一字符集. 它们合并双方的工作成果, 并为创立一个单一编码表而协同工作. 两个项目仍都存在并独立地公布各自的标准, 但 Unicode 协会和 ISO/IEC JTC1/SC2 都同意保持 Unicode 和 ISO 10646 标准的码表兼容, 并紧密地共同调整任何未来的扩展.
3.什么是UTF-8(一种传送和存储格式)
UCS和UNICODE为每个字符分配了一个对应的整数,但并没有明确说明其实现机制.故存在多种编码方式,其中以两个字节和四个字节来存储一个字符的方法分别叫UCS-2, UCS-4,要将一个ASCII文件转换成一个UCS-2文件只要在每个字节前加一个字节0X00,转换成UCS-4只要在每个字节前加三个0X00。
而internet上大量的信息是以ASCII码存在的,如果都用两个字节来存储将浪费大量的资源,同时Unix和Linux下使用USC-2和USC-4会导致严重问题,于是出现了UTF-8(定义于ISO10646-1).
UTF-8(UTF-8 stands for Unicode Transformation Format-8. It is an octet (8-bit) lossless encoding of Unicode characters.)
UTF-8就是以8位为单元对UCS进行编码。从UCS-2到UTF-8的编码方式如下:
UCS-2编码(16进制) |
UTF-8 字节流(二进制) |
0000 - 007F |
0xxxxxxx |
0080 - 07FF |
110xxxxx 10xxxxxx |
0800 - FFFF |
1110xxxx 10xxxxxx 10xxxxxx |
例如“汉”字的Unicode编码是6C49。6C49在0800-FFFF之间,所以肯定要用3字节模板了:1110xxxx 10xxxxxx 10xxxxxx。将6C49写成二进制是:0110 110001 001001, 用这个比特流依次代替模板中的x,得到:11100110 10110001 10001001,即E6 B1 89。
读者可以用记事本测试一下我们的编码是否正确。需要注意,UltraEdit在打开utf-8编码的文本文件时会自动转换为UTF-16,可能产生混淆。你可以在设置中关掉这个选项。更好的工具是Hex Workshop。
UTF-16以16位为单元对UCS进行编码。对于小于0x10000的UCS码,UTF-16编码就等于UCS码对应的16位无符号整数。对于不小于0x10000的UCS码,定义了一个算法。不过由于实际使用的UCS2,或者UCS4的BMP必然小于0x10000,所以就目前而言,可以认为UTF-16和UCS-2基本相同。但UCS-2只是一个编码方案,UTF-16却要用于实际的传输,所以就不得不考虑字节序的问题。
========================================================================
下面是一个转换的宏模块:
//ucs2 char to utf8 char
#define UCS2_CHAR_CONVERT(c,dest,len) {\
if(c < 0x80)\
len = 1;\
else if(c < 0x800)\
len = 2;\
else\
len = 3;\
switch (len) {\
case 3: dest[2] = 0x80 | (c & 0x3f); c = (c >> 6) | 0x800;\
case 2: dest[1] = 0x80 | (c & 0x3f); c = (c >> 6) | 0xc0;\
case 1: dest[0] = (BYTE)c;\
};\
}
代码的分析:
参数的含义:
@c: ucs2的一个字符, 2个字节
@dest: 存放转换后的一个数组, byte类型的, 数组长度是3
@len: 一个Int类型的技术flag, 用于记录ucs2的字符"c"转换成uft8需要多少个字节
代码段的第一个模块是, 判断字符"c"转换成uft8的存储格式需要几个字节。
代码段的第二个模块, 也就是switch语句: 作用是转换字符码。下面分析若len等于3的情况。
case3的步骤: 1、将"c"中的前6个字符取出来, 然后在加上1000 0000, 最终保存在数组3中的数据时10xxxxxx。
2、把"c"向右移动6位, 同时加上一个标志符号。 "c"结果为: 000010xx xxxxxxxx
case2的步骤: 1、将"c"中的后6个字符取出来, 加上1000 0000, 保存在数组2中的数据是10xxxxxx。
2、将"c"向右移动6位, 同时加上一个标志位。 "c"的结果为: 00000000 1110xxxx。
case1的步骤: 1、将"c"的剩余4位直接保存在数组1中。
这样就完成了3字节数据格式的转换了
至于2字节的转换, 1字节的转换, 我想聪明的你们一定应该知道是怎么回事了,以及如何使用它了。
希望这个函数能减轻你的代码量。
这是本人第一次对外写技术文档, 希望大家给点支持,同时给点意见, 以后我会继续将我工作中好的
代码拿出来给大家分享。
同时给大家点意见, 就是多看开源社区大师级的代码, 这样对你的代码质量会有很大的帮助。
分享到:
相关推荐
根据提供的文件信息,可以看出这里的目标是通过T-SQL创建一个函数`usf_ChineseCost`,该函数可以接收一个浮点数作为输入参数,并将其转换为中文大写金额表示形式。接下来,我们将深入分析并解释这段代码的具体实现...
例如,通过在字符数组中寻找“PR”字母组合来提取剖面或测线信息,并通过char函数将ASCII数据转换成字符串数组,再通过str2num函数转换为数值进行处理。数据块的读取相对简单,每行数据为81个字节,包括ASCII的换行...
在本软件中,选择“To WMV/USF”(或英文界面中的[To wmv/usf]选项),表明您将把FLV文件转换成WMV格式。 4. 开始转换:最后,点击“Convert”(或英文界面中的[convert]按钮)开始转换过程。软件会自动处理每个...
"PDF攻击实例-USF-ISA-SWA-Shadow Attack.7z" 提供的压缩包内容,很可能是关于一种特定的PDF安全威胁的研究或示例。 USF(University of South Florida)可能是指此案例研究的来源,一个知名的学术机构。ISA...
电磁波技术则是利用频率在300兆赫到300千兆赫之间的电磁波作用于废水,特别是对于极性分子,能在短时间内产生剧烈的能量转换。在微波的作用下,分子的极性取向迅速变化,导致分子运动加剧和内部变化,转化为热能、...
USF MSDS501 计算数据科学中文讲义
标题 "PyPI 官网下载 | usf-auth-service-client-0.0.15.tar.gz" 暗示我们正在讨论一个在Python Package Index (PyPI) 上发布的软件包,名为 "usf-auth-service-client" 的版本0.0.15。PyPI是Python开发者发布和分享...
usf-cs112-sp-2021-项目USF CS112项目(2021年Spring)2021年2月9日第一次git练习
标题 "USF-Data-Structures:2014 年秋季学期在数据结构中分配的项目" 提供的信息表明,这是一个与数据结构相关的教育项目,可能是由美国圣弗朗西斯科大学(University of San Francisco,简称USF)在2014年秋季学期...
XShaderCompiler是一个强大的工具,专为游戏开发者和图形程序员设计,它允许将高级着色语言(HLSL,High-Level Shader Language)的代码,即Shader Model 4和5,转换为GLSL(OpenGL Shading Language)。这个转换...
在usf代码中,我们可以看到这些基本元素的运用,理解它们如何组合成更复杂的逻辑,这对于初学者是极好的学习材料。 2. **指针操作** C语言的精髓之一就是指针,它允许直接访问内存地址。通过分析usf代码中的例子,...
【USF_Aviation_Project: USF 航空项目SQL Server代码】 USF_Aviation_Project 是一个基于SQL Server的数据库项目,主要用于处理与航空相关的数据和业务逻辑。在这个项目中,SQL Server被用作核心的数据存储和管理...
USF 地图应用程序 USF 地图应用程序(最初称为 MoBullity)可帮助 USF 学生、教职员工和访客使用各种交通方式(步行、骑车、、、、)游览 USF 坦帕校区。 USF 地图应用程序提供以下功能: 基于实时公交和共享单车...
标题中的"M3350支持USF单贴速度快容量大"指的是某款型号为M3350的存储设备,它采用了USF(Universal Storage Format)接口,这种接口设计能够提供快速的数据传输速度和较大的存储容量。USF是一种专门为移动设备如...
“usf 三星8+128 KM8V7001JA-B813”这一标签则进一步强调了该芯片的类型、品牌和存储容量。 部分内容解析: - 文档的发布日期是2018年8月,这暗示了器件的版本信息以及可能的生产时间。 - 三星电子保留了更改产品、...
资源分类:Python库 所属语言:Python 资源全名:usf-auth-service-client-0.0.10.tar.gz 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059
USF-VR-Tour
【DJVU转换为PDF】是一个重要的文件格式转换任务,主要涉及到DJVU格式和PDF格式的理解以及转换工具的使用。DJVU是一种高效的图像压缩格式,尤其适用于存储多页文档,如书籍、杂志和扫描文件,因为它可以将文本和图像...
【标题】"WICSE-USF.github.io" 指的是一个基于GitHub托管的网站,主要服务于南佛罗里达大学(USF)计算机科学领域的女性群体,名为Women in Computer Science and Engineering(WICSE)。这个网站可能包含了关于...