`
freesoftman
  • 浏览: 318792 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

usf2 转成 utf8的转换函数

阅读更多

在网上找了个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 金额转大写

    根据提供的文件信息,可以看出这里的目标是通过T-SQL创建一个函数`usf_ChineseCost`,该函数可以接收一个浮点数作为输入参数,并将其转换为中文大写金额表示形式。接下来,我们将深入分析并解释这段代码的具体实现...

    V8系统TEM原始曲线绘制的MATLAB程序实现.pdf

    例如,通过在字符数组中寻找“PR”字母组合来提取剖面或测线信息,并通过char函数将ASCII数据转换成字符串数组,再通过str2num函数转换为数值进行处理。数据块的读取相对简单,每行数据为81个字节,包括ASCII的换行...

    flv wmv视频转换器

    在本软件中,选择“To WMV/USF”(或英文界面中的[To wmv/usf]选项),表明您将把FLV文件转换成WMV格式。 4. 开始转换:最后,点击“Convert”(或英文界面中的[convert]按钮)开始转换过程。软件会自动处理每个...

    PDF攻击实例-USF-ISA-SWA-Shadow Attack.7z

    "PDF攻击实例-USF-ISA-SWA-Shadow Attack.7z" 提供的压缩包内容,很可能是关于一种特定的PDF安全威胁的研究或示例。 USF(University of South Florida)可能是指此案例研究的来源,一个知名的学术机构。ISA...

    USF 电磁波技术在石油化工废水处理中的应用.pdf

    电磁波技术则是利用频率在300兆赫到300千兆赫之间的电磁波作用于废水,特别是对于极性分子,能在短时间内产生剧烈的能量转换。在微波的作用下,分子的极性取向迅速变化,导致分子运动加剧和内部变化,转化为热能、...

    USF MSDS501 计算数据科学中文讲义

    USF MSDS501 计算数据科学中文讲义

    PyPI 官网下载 | usf-auth-service-client-0.0.15.tar.gz

    标题 "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-project:USF CS112项目(2021年Spring)

    usf-cs112-sp-2021-项目USF CS112项目(2021年Spring)2021年2月9日第一次git练习

    USF-Data-Structures:2014 年秋季学期在数据结构中分配的项目

    标题 "USF-Data-Structures:2014 年秋季学期在数据结构中分配的项目" 提供的信息表明,这是一个与数据结构相关的教育项目,可能是由美国圣弗朗西斯科大学(University of San Francisco,简称USF)在2014年秋季学期...

    XShaderCompiler:用于将HLSL(Shader Model 4和5)转换为GLSL的Shader交叉编译器

    XShaderCompiler是一个强大的工具,专为游戏开发者和图形程序员设计,它允许将高级着色语言(HLSL,High-Level Shader Language)的代码,即Shader Model 4和5,转换为GLSL(OpenGL Shading Language)。这个转换...

    usf代码:一些好用或有趣的代码,程序

    在usf代码中,我们可以看到这些基本元素的运用,理解它们如何组合成更复杂的逻辑,这对于初学者是极好的学习材料。 2. **指针操作** C语言的精髓之一就是指针,它允许直接访问内存地址。通过分析usf代码中的例子,...

    USF_Aviation_Project:USF Aviation项目SQL Server代码

    【USF_Aviation_Project: USF 航空项目SQL Server代码】 USF_Aviation_Project 是一个基于SQL Server的数据库项目,主要用于处理与航空相关的数据和业务逻辑。在这个项目中,SQL Server被用作核心的数据存储和管理...

    超市管理系统java源码下载-usf-mobullity:USF地图响应式Web应用程序

    USF 地图应用程序 USF 地图应用程序(最初称为 MoBullity)可帮助 USF 学生、教职员工和访客使用各种交通方式(步行、骑车、、、、)游览 USF 坦帕校区。 USF 地图应用程序提供以下功能: 基于实时公交和共享单车...

    M3350支持USF单贴速度快容量大,但是网上目前流传的工具是有BUG的,可能会把ROM量产死.zip

    标题中的"M3350支持USF单贴速度快容量大"指的是某款型号为M3350的存储设备,它采用了USF(Universal Storage Format)接口,这种接口设计能够提供快速的数据传输速度和较大的存储容量。USF是一种专门为移动设备如...

    SEC_Datasheet_GX12864_AA KM8V7001JA-B813 254F 11.5x13_1.00.00_Final.pdf

    “usf 三星8+128 KM8V7001JA-B813”这一标签则进一步强调了该芯片的类型、品牌和存储容量。 部分内容解析: - 文档的发布日期是2018年8月,这暗示了器件的版本信息以及可能的生产时间。 - 三星电子保留了更改产品、...

    Python库 | usf-auth-service-client-0.0.10.tar.gz

    资源分类:Python库 所属语言:Python 资源全名:usf-auth-service-client-0.0.10.tar.gz 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059

    USF-VR-Tour

    USF-VR-Tour

    DJVU convert toPDF

    【DJVU转换为PDF】是一个重要的文件格式转换任务,主要涉及到DJVU格式和PDF格式的理解以及转换工具的使用。DJVU是一种高效的图像压缩格式,尤其适用于存储多页文档,如书籍、杂志和扫描文件,因为它可以将文本和图像...

    WICSE-USF.github.io

    【标题】"WICSE-USF.github.io" 指的是一个基于GitHub托管的网站,主要服务于南佛罗里达大学(USF)计算机科学领域的女性群体,名为Women in Computer Science and Engineering(WICSE)。这个网站可能包含了关于...

Global site tag (gtag.js) - Google Analytics