关于UTF-8的规则:https://baike.baidu.com/item/UTF-8/481798?fr=aladdin

  使用windows系统下的Ubuntu子系统,实现C语言对UTF-8编码格式的文字处理。

  

#include <stdio.h>

// 根据UTF-8的编码格式,打印处文字以及它们相应的编码
// 形参:获取一个无符号字符指针
void PrintUTF8Encoding(unsigned char *str)
{
unsigned char *chr = str;
// 根据UTF-8的规则,一个文字占几个字节可以从首个编码的二进制高位数看出来
// 0代表1个字节,11代表两个字节,以此类推,最多有六个字节
unsigned char bytesArr[] = {0b0, 0b11, 0b111, 0b1111, 0b11111, 0b111111};
int i, j;
// bytes存储当前字符的字节数
int bytes;
unsigned char *tmp;
// C中字符字面量都由'\0'结尾
while (*chr != '\0')
{
// 依次循环,确认当前字符有多少个字节
for (i = 6; i > 0; i--)
{
j = 8 - i;
if ((*chr>>j) == bytesArr[i-1])
{
bytes = i;
break;
}
}
// 循环打印出当前字符的字节
// 注意:多字节必须放在一起打印才能显示出正确的文字
tmp = chr;
for (i = 0; i < bytes; i++)
{
putchar(*tmp);
++tmp;
}
// 打印出字节的十六进制编码
printf(": ");
tmp = chr;
for (i = 0; i < bytes; i++)
{
printf("%x-", *tmp);
++tmp;
}
printf("\b \n");
// 根据当前字符的字节数,跳过相应个字节
chr += bytes;
}
} int main()
{
PrintUTF8Encoding("Hello, world!¡Hast, mañana!你好,世界!よこそ!"); return 0;
}

Resistance is Futile!

最新文章

  1. win7安装oracle 时容易出的问题
  2. SSAS动态添加分区 (转载)
  3. Rendering Problems:android.support.v7.internal.widget.ActionBarOverlayLayout 解决方法
  4. jQuery LigerUI 最新版压缩包(含chm帮助文档、源码、donet权限示例)
  5. C#中判断子窗体是否存在
  6. MimeTypes list
  7. ASP.NET 窗体间传值实现方法详解
  8. 琐碎-到底要不要SSH免密码设置
  9. 软件测试之WEB测试经典总结
  10. 《Java程序员面试笔试宝典》之组合与继承有什么区别
  11. 模拟美萍加密狗--Rockey2虚拟狗(二)
  12. POJ 1426 Find The Multiple BFS
  13. C语言 memcpy二维数组的复制
  14. android 下Protobuff框架性能测试结果
  15. APICloud使用
  16. iOS MVVM架构总结
  17. loadrunner&#160;脚本开发-文件读写操作
  18. CTSC2018&amp;APIO2018游记
  19. HDU 1402 A * B Problem Plus 快速傅里叶变换 FFT 多项式
  20. 论文笔记——PRUNING FILTERS FOR EFFICIENT CONVNETS

热门文章

  1. c语言:sprintf() 数字转字符赋值给数组
  2. 第 1 题:HTML 和 HTML5 有什么区别?
  3. ES6 Class类
  4. CentOS下 Django部署 nginx+uWSGI+Django(二)
  5. vue tab实现右定位
  6. jenkens安装教程
  7. VM12升级VM15
  8. SQL SERVER 雨量计累计雨量(小时)的统计思路
  9. Android 开发必备的知识点——JVM基础【转】
  10. noip模拟22[d&#183;e&#183;f]