在格式转换中,对于字符的处理,需要知道几种编码格式。下面这两篇博客对unicode,utf-8有比较详细的描述。

https://blog.csdn.net/zhusongziye/article/details/84261211?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task

https://blog.csdn.net/qq_24326765/article/details/82183167

这篇博客讲的是,首先从内存中读入一个字符,然后将字符通过格式转换,转成另一种格式的字符串(16进制)。

这里会用到几个关键技术:

Unicode 与 UTF-8 互转

1. UTF-8 的编码规则是:

① 对于单字节的符号,字节的第一位设为 0,后面的7位为这个符号的 Unicode 码,因此对于英文字母,UTF-8 编码和 ASCII 码是相同的。

② 对于n字节的符号(n>1),第一个字节的前 n 位都设为 1,第 n+1 位设为 0,后面字节的前两位一律设为 10,剩下的没有提及的二进制位,全部为这个符号的 Unicode 码 。

举个例子:比如说一个字符的 Unicode 编码是 130,显然按照 UTF-8 的规则一个字节是表示不了它(因为如果是一个字节的话前面的一位必须是 0),所以需要两个字节(n = 2)。

根据规则,第一个字节的前 2 位都设为 1,第 3(2+1) 位设为 0,则第一个字节为:110X XXXX,后面字节的前两位一律设为 10,后面只剩下一个字节,所以后面的字节为:10XX XXXX。

所以它的格式为 110XXXXX 10XXXXXX 。

那么对于一个具体的 Unicode 编号,具体怎么进行 UTF-8 的编码呢?

首先找到该 Unicode 编号所在的编号范围,进而可以找到与之对应的二进制格式,然后将该 Unicode 编号转化为二进制数(去掉高位的 0),最后将该二进制数从右向左依次填入二进制格式的 X 中,如果还有 X 未填,则设为 0 。

比如:“马”的 Unicode 编号是:0x9A6C,整数编号是 39532,对应第三个范围(2048 - 65535),其格式为:1110XXXX 10XXXXXX 10XXXXXX,39532 对应的二进制是 1001 1010 0110 1100,将二进制填入进入就为:

11101001 10101001 10101100 。

2. 将UTF-8转换成Unicode

继续拿上面的数值举例,现在有一个UTF-8编码为1110XXXX 10XXXXXX 10XXXXXX的字符,如何转换成Unicode?

UTF-8: 11101001 10101001 10101100

(1) 将*current_char指向低位地址的11101001,*(current_char+1)则指向的是中间字节10101001, *(current_char+2)则指向的是高位的10101100

(2) 转换第一个字节:

*current_char & 0x0F << 4 得到-> 10010000,*(current+1) &0x3C >>2 得到->00001010,接着

(*current_char & 0x0F << 4) | (*(current+1) &0x3C >>2) -> 10011010

(3) 转换第二个字节:

*(current+1) &0x03 << 6 得到->01000000,*(current+2) &0x3F>>2 得到->00101100,接着

(*(current+1) &0x03 << 6) | (*(current+2) &0x3F>>2) ->01101100

(4) 拼接两个字节:

char *unicode;

sprintf(unicode, "\\u%02X02X", (*current_char & 0x0F << 4) | (*(current+1) &0x3C >>2),

(*(current+1) &0x03 << 6) | (*(current+2) &0x3F>>2)))

下面是简化的代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int dec2hex(char *in);int main(void)
{//输入一个字符串int i, str_len;char *str = (char *)malloc(sizeof(char) * 12);str = "hello";char *current_char;                //当前字符printf("size of str = %d.\n", str_len = strlen(str));//将每一个字符放入指针for (i = 0; i < str_len; i++) {current_char = &str[i];printf("before convert, current_char[%d] = %c. 0d = %d. \n", i, *current_char, (int)*current_char);dec2hex(current_char);}//输出一个utf8free(str);return 0;
}int dec2hex(char *in)
{char *utf8 = (char*)malloc(sizeof(char)*8);sprintf(utf8, "\\u%02X", (0x0F & *in) << 4);printf("after convert, current_char = %s.\n", utf8);return 0;
}

与运算

0,1 和 1 做与运算都得到自身,因此0x0F & char,就是取char的低四位

移位

经过与运算取到char的低四位后,<<4,左移4位,即把char的低四位顶到了高四位,原来的低四位补零

如0110 1100 & 0x0F => 0000 1100 << 4 => 1100 0000


结果:

size of str = 5.

before convert, current_char[0] = h. 0d = 104.

after convert, current_char = \u80.

before convert, current_char[1] = e. 0d = 101.

after convert, current_char = \u50.

before convert, current_char[2] = l. 0d = 108.

after convert, current_char = \uC0.

before convert, current_char[3] = l. 0d = 108.

after convert, current_char = \uC0.

before convert, current_char[4] = o. 0d = 111.

after convert, current_char = \uF0.

C语言将字符转十六进制相关推荐

  1. c语言输出字符的十六进制,用c语言输入键盘上的字符后转换成十六进制输出

    用c语言输入键盘上的字符后转换成十六进制输出 悬赏分:10 | 提问时间:2010-9-13 10:26 | 提问者:745922085 | 问题为何被关闭 其他回答 共3条 #include #in ...

  2. 计算机c语言基础字符,2008计算机二级考试:C语言基础教程-C语言字符型数据

    2.5.1字符常量 字符常量是指用一对单引号括起来的一个字符.如'a','9','!'.字符常量中的单引号只起定界作用并不表示字符本身.单引号中的字符不能是单引号(')和反斜杠(\),它们特有的表示法 ...

  3. c语言中字符加上48是,【2017年整理】C语言字符型数据(4、5).doc

    [2017年整理]C语言字符型数据(4.5) 2.5.1字符常量字符常量是指用一对单引号括起来的一个字符.如'a','9','!'.字符常量中的单引号只起定界作用并不表示字符本身.单引号中的字符不能是 ...

  4. C语言 文本字符串和十六进制形式的相互转换

                                                      C语言 文本字符串和十六进制形式的相互转换 一.简述        记--C语言实现 文本形式的字符 ...

  5. c语言 转移字符',转义字符

    所有的ASCII码都可以用"\"加数字(一般是8进制数字)来表示.而C中定义了一些字母前加"\"来表示常见的那些不能显示的ASCII字符,如\0,\t,\n等, ...

  6. C语言的格式输出 C语言中字符的作用:

    这是C语言的格式输出,%c,%y这些代表你要输出的数据的数据类型:%d 表示输出十进制有符号的整数. 1.%u 十进制无符号整数. 2.%f 表示输出浮点数. 3.%s表示输出 字符串. 4.%c表示 ...

  7. R语言将字符型(Character)变量转化为数值型(Numeric)

    R语言将字符型(Character)变量转化为数值型(Numeric) 目录 R语言将字符型(Character)变量转化为数值型(Numeric) #基本语法

  8. c++ 字符串合并_C语言输入字符和字符串(所有函数大汇总)

    C语言输入字符和字符串(所有函数大汇总) C语言有多个函数可以从键盘获得用户输入,它们分别是: scanf():和 printf() 类似,scanf() 可以输入多种类型的数据. getchar() ...

  9. c语言基本字符集ppt,C语言的字符集和保留字知识讲稿.ppt

    C语言的字符集和保留字知识讲稿.ppt 第一章 概述 重点: C语言的字符集和保留字: C语言词类和语句的分类: C程序的基本结构. 程序--是对解决某个问题的方法的描述: 对计算机来说:程序是用某种 ...

最新文章

  1. 人工智能正在向具有“高情商”发展
  2. linux wifi 报错 siocsifflags: operation not possible due to rf-kill
  3. 入门训练 Fibonacci数列-python实现
  4. linux 自动ping脚本,linux上ping脚本及zabbix3.xx上自动发现
  5. mysql cmd终端服务无法启动
  6. Lesson 4.5 梯度下降优化基础:数据归一化与学习率调度
  7. 邮件系统三功能 建金字塔防护体系
  8. jsap支付_Java命令行界面(第20部分):JSAP
  9. 实例57:python
  10. crontab 每周五_crontab定时任务 每隔一周的周五执行
  11. 和媳妇加一起月薪三万五想换车了不知道x5养的起吗?
  12. webkit内核的浏览器
  13. 自动更改IP地址反爬虫封锁
  14. chronodex怎么用_滴答清单使用全攻略:如何把手帐搬到滴答清单上,提升效率?...
  15. 基于asyncio编写一个telegram爬虫机器人
  16. 提高微信小程序的应用速度的常见方式有哪些? 小程序怎么实现下拉刷新? 简述微信小程序原理? 小程序的发布流程(开发流程)分析下微信小程序的优劣势?小程序授权登录流程? 小程序支付如何实现
  17. ASP.NET EXCEL导入,身份证、手机号长度校验数据校验
  18. 创建Hello world
  19. 如何发掘各种暴利的赚钱项目,如何知道别人在干什么赚钱
  20. php写后台轮播图,后台管理系统--轮播图管理

热门文章

  1. 五种思维方式助力商人成功
  2. get 新技能 Math.ceil();函数的用法
  3. 华大Flash檫写导致重启异常问题
  4. fputc()和fgetc()应用
  5. Licode Docker映像
  6. 新版《GB/ T 38661-2020 》简介
  7. 相机和livox激光雷达外参标定:ROS功能包---livox_camera_lidar_calibration 使用方法
  8. hive 指定字段插入数据_为hive增加列存储
  9. 禅道详细介绍及使用方法
  10. UNICODE字碼分佈表