GBK是Windows默认的汉字编码方式,又称国标。想在控制台或是控件上显示汉字使用这种编码方式最方便。

UTF-8是一种变长字节编码方式,把字节数边长,可以容纳更多的信息。

UTF-8编码方式:

当码长为1字节的时候,兼容ascii编码,格式为0xxxxxxx (x处表示有效位)
当码长为2字节的时候,格式为110xxxxx 10xxxxxx
当码长为3字节的时候,格式为1110xxxx 10xxxxxx 10xxxxxx
当码长为4字节的时候,格式为11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

...

来自:https://blog.csdn.net/haohulala/article/details/86600936

· UTF8编码的码长最大为6字节,1111110x 10...

· 如果一个汉字的utf8编码为110aaaaa 10bbbbbb 则其对应的Unicode编码为aaaaabbbbbb,其他同理

所以我们就有了对于单个字符的UTF-8到Unicode的转换过程

int GetUTF8Length(unsigned char *sUTF8){ unsigned char _s0=sUTF8[0];if( _s0 >> 7 == 0b0 )return 1;if( _s0 >> 5 == 0b110 )return 2;if( _s0 >> 4 == 0b1110 )return 3;if( _s0 >> 3 == 0b11110 )return 4;if( _s0 >> 2 == 0b111110 )return 5;if( _s0 >> 1 == 0b1111110 )return 6;return 0;
}
unsigned int UTF8_To_Unicode(unsigned char *sUTF8){int l=GetUTF8Length(sUTF8);if(l==1) return sUTF8[0];if(l==2) return ((sUTF8[0]& 0b00011111)<<6) +  (sUTF8[1]& 0b00111111);//0b110xxxxxif(l==3) return ((sUTF8[0]& 0b00001111)<<12) + ((sUTF8[1]& 0b00111111)<<6)+  (sUTF8[2]& 0b00111111);//0b1110xxxxif(l==4) return ((sUTF8[0]& 0b00000111)<<18)+ ((sUTF8[1]& 0b00111111)<<12)+ ((sUTF8[2]& 0b00111111)<<6)+  (sUTF8[3]& 0b00111111);//0b11110xxxif(l==5) return ((sUTF8[0]& 0b00000011)<<24)+ ((sUTF8[1]& 0b00111111)<<18)+ ((sUTF8[2]& 0b00111111)<<12)+ ((sUTF8[3]& 0b00111111)<<6)+  (sUTF8[4]& 0b00111111);//0b111110xxif(l==6) return ((sUTF8[0]& 0b00000001)<<30)+ ((sUTF8[1]& 0b00111111)<<24)+ ((sUTF8[2]& 0b00111111)<<18)+ ((sUTF8[3]& 0b00111111)<<12)+ ((sUTF8[4]& 0b00111111)<<6)+  (sUTF8[5]& 0b00111111);//0b1111110x
}

我暂且还没想出一种好的算法把这几大坨if用一个简短的表达式表示,欢迎大家讨论。

至于Unicode到GBK的转换,c++有一些函数可以帮忙

char* Unicode_To_GBK(unsigned int cUni){//Unicode 16 BEchar* sGBK=new char[6];wsprintf(sGBK,"%wc",(wchar_t)cUni);return sGBK;
}

下面是读取汉字源码

#include <Windows.h>
#include<iostream>
#include<cstdio>
//#include<bitset>
#include<cstring>
using namespace std;
//void binoutput(int n){ //二进制输出
//  cout<<bitset<10>(n)<<"\n";
//}int GetUTF8Length(char *sUTF8){ unsigned char _s0=sUTF8[0];if( _s0 >> 7 == 0b0 )return 1;if( _s0 >> 5 == 0b110 )return 2;if( _s0 >> 4 == 0b1110 )return 3;if( _s0 >> 3 == 0b11110 )return 4;if( _s0 >> 2 == 0b111110 )return 5;if( _s0 >> 1 == 0b1111110 )return 6;return 0;
}
unsigned int UTF8_To_Unicode(unsigned char *sUTF8){int l=GetUTF8Length(reinterpret_cast<char *>(sUTF8));if(l==1) return sUTF8[0];if(l==2) return ((sUTF8[0]& 0b00011111)<<6) +  (sUTF8[1]& 0b00111111);//0b110xxxxxif(l==3) return ((sUTF8[0]& 0b00001111)<<12) + ((sUTF8[1]& 0b00111111)<<6)+  (sUTF8[2]& 0b00111111);//0b1110xxxxif(l==4) return ((sUTF8[0]& 0b00000111)<<18)+ ((sUTF8[1]& 0b00111111)<<12)+ ((sUTF8[2]& 0b00111111)<<6)+  (sUTF8[3]& 0b00111111);//0b11110xxxif(l==5) return ((sUTF8[0]& 0b00000011)<<24)+ ((sUTF8[1]& 0b00111111)<<18)+ ((sUTF8[2]& 0b00111111)<<12)+ ((sUTF8[3]& 0b00111111)<<6)+  (sUTF8[4]& 0b00111111);//0b111110xxif(l==6) return ((sUTF8[0]& 0b00000001)<<30)+ ((sUTF8[1]& 0b00111111)<<24)+ ((sUTF8[2]& 0b00111111)<<18)+ ((sUTF8[3]& 0b00111111)<<12)+ ((sUTF8[4]& 0b00111111)<<6)+  (sUTF8[5]& 0b00111111);//0b1111110x
}
char* Unicode_To_GBK(unsigned int cUni){//Unicode 16 BEchar* sGBK=new char[6];wsprintf(sGBK,"%wc",(wchar_t)cUni);return sGBK;
}
char* UTF8_To_GBK(char *sUTF8){return Unicode_To_GBK(UTF8_To_Unicode(reinterpret_cast<unsigned char *>(sUTF8)));
}
int main(){
/*
啊   GBK:            0xB0 0xA1Unicode-16 LE: 0x4A 0x55Unicode-16 BE: 0x55 0x4AUTF-8:         0xE5 0x95 0x8A
*/FILE *fp=fopen("hanzi.txt","r");char str[100]={0},*pstr,*endstr;while(!feof(fp)){fgets(str,100,fp);pstr=str;endstr=str+strlen(str);while(pstr < endstr){printf("%s",UTF8_To_GBK(pstr));pstr+= GetUTF8Length(pstr);}}fclose(fp);
}

提一嘴reinterpret_cast,强制转换真是太爽了,当年被一堆cannot convert from type to const type 要折磨疯了。

从txt文件读取汉字(UTF-8到Unicode到GBK的转化)相关推荐

  1. python 读取txt文件为字典_python将txt文件读取为字典的示例

    如下所示: # -*- coding: utf-8 -*- # @Time :18-8-2 下午3:23 import sys reload(sys) sys.setdefaultencoding(' ...

  2. 已创建了一个包含学生学号、身高、性别的学生身高信息表并输出到屏幕,学生信息从records.txt文件读取。 编写一个函数 void reverse(Seqlist *lp); 功能是对已建立的学生身

    已创建了一个包含学生学号.身高.性别的学生身高信息表并输出到屏幕,学生信息从records.txt文件读取.(结构体数组版本) (1)30' 编写一个函数 void reverse(Seqlist * ...

  3. c 语言代码 读入一个浮点数,c – 从.txt文件读取浮点数

    如何从.txt文件读取浮点数.根据每行开头的名称,我想读取不同数量的坐标.浮标由"空间"分隔. 示例:三角形1.2 -2.4 3.0 结果应该是: float x = 1.2 / ...

  4. python txt文件处理软件,对python .txt文件读取及数据处理方法总结

    1.处理包含数据的文件 最近利用python读取txt文件时遇到了一个小问题,就是在计算两个np.narray()类型的数组时,出现了以下错误: 作为一个python新手,遇到这个问题后花费了挺多时间 ...

  5. python从txt拿取数据_python从txt文件读取数据

    (作为一个python初学者,记录一点学习期间的笔记,方便日后查阅,若有错误或者更加便捷的方法,望指出!) 1.读取TXT文件数据,并对其中部分数据进行划分.一部分作为训练集数据,一部分作为测试集数据 ...

  6. python读取txt文件中的数字_python从txt文件读取数据

    (作为一个python初学者,记录一点学习期间的笔记,方便日后查阅,若有错误或者更加便捷的方法,望指出!) 1.读取TXT文件数据,并对其中部分数据进行划分.一部分作为训练集数据,一部分作为测试集数据 ...

  7. php上传txt文件读取乱码

    php读取上传的txt文件时会出现俩种格式 EUC-CN格式 CP936格式 $file_txt = $dir . $file_name;$data=array();$i=0;$content=fop ...

  8. txt文件读取(已解决中文乱码)

    昨天读取txt文档的时候始终出现中文乱码,去好多网站看了,都TMD一坑,根本没有解决问题嘛!大多数博客上写的的格式就是一样的不晓得哪个超哪个,最后终于在http://blog.csdn.net/max ...

  9. java快速数据度数抵导入_java – 使用扫描仪从.txt文件读取度数符号

    我正在为我的模拟器飞行编写一个主程序.我在.txt文件中收到简报,我试图用扫描仪读取文件. .txt文件包含度数符号,这会导致扫描程序不读取整个文件. public static String[] C ...

最新文章

  1. c++ 弧形面如何逆时针排序_这8种常见的Java排序算法,学算法必看!
  2. 杂七杂八(1)——如何查看本机的.NET Framework版本
  3. secureCRT 小技巧
  4. js 用下标获取map值_javascript怎么获取map的值?
  5. Python 自动化,Helium 凭什么取代 Selenium?
  6. 新加坡金融管理局主席:数字货币会使传统风险变得更加明显
  7. Ubuntu18.04谷歌输入法中文候选此框消失问题
  8. Linux下禁止ping最简单的方法
  9. 黑马程序员—黑马程序员CEO方立勋致全体员工和同学们的公开信
  10. 【ACM】C++程序设计ACM题库总结
  11. 计算机学部毕业设计答疑记录,毕业论文指导记录怎么写?毕业论文指导记录12篇...
  12. 苹果手机装android应用程序,Android/iOS手机安装HP打印机的详细方法和操作步骤
  13. 广告投放管理平台 oython源码_【直播】全新腾讯广告投放管理平台如何帮助广告主乘风破浪?...
  14. 怎样开启无线热点服务器,Win7开启无线WIFI热点
  15. java 画图板 锯齿_java绘画中的锯齿问题
  16. Django自动化测试平台项目案例
  17. html仿短信聊天,前端开发JS模仿手机短信发送
  18. discuz!内置代码
  19. Android反编译之36kr.app
  20. 2021珠海数据开放创新应用大赛今日启动 征集创意创新应用 争夺数据最强大脑

热门文章

  1. 使用运动控制卡,卡顿、蓝屏了怎么办?优易控提供更高级的解决方案
  2. vscode虚拟环境运行文件报错ImportError: DLL load failed: 找不到指定的模块的问题
  3. java中文乱码问题
  4. PFMEA分享丨PFD过程流程图的那些事
  5. 一些通信方面的专业术语
  6. rocketmq 如何保证高可用_如何保证消息队列是高可用的
  7. 2021-11-08-英语一万核心词汇的音频地址和单词书地址
  8. 实战篇-OpenSSL之调用EVP框架实现AES多种加密模式
  9. QQ游戏对对碰辅助程序
  10. 微软官方XP精简版 FLP入门版SP3截图