windows程序设计03_读取utf8文件
这里用到的读取utf8文件的思路特别朴素.先把utf8文件按char读取到内存里.因为utf8是变长的,为了处理方便,在内存里把char转化成wchar_t,这样一个字符就是一个wchar_t.把utf8文件转成wchar_t的字符串之后,可以进行各种操作,比如统计非中文字符,对齐等.当然也包含要显示wchar_t.windows的命令行不能直接显示wchar_t字符,想显示必须再把wchar_t转成gbk或者utf8.
看C28ShowWchar.c的代码:
//utf-8编码
#include <stdio.h>
#include <windows.h>
char* unicode2Utf8(wchar_t* unicodeStr) {
	int cStrLen = WideCharToMultiByte(CP_UTF8, 0, unicodeStr, -1, NULL, 0, NULL, NULL);
	char* cStr = (char*)malloc(sizeof(char) * (cStrLen + 1));
	WideCharToMultiByte(CP_UTF8, 0, unicodeStr, -1, cStr, cStrLen + 1, NULL, NULL);
	*(cStr + cStrLen) = '\0';
	return cStr;
}
void main() {
	wchar_t* unicodeStr = L"中国";
	char* utf8Str = unicode2Utf8(unicodeStr);
	printf("%s\n", utf8Str);
	getchar();
}
打开VS的"开发人员命令提示符",执行下面命令把命令行的编码设置成utf8:
CHCP 65001
再把字体设置成"Lucida Console"
然后用下面命编译链接
cl C28ShowWchar.c /source-charset:utf-8
/source-charset:utf-8表示编码是utf8.再运行生成的可执行文件就能看到"中国"两个汉字.
再看源代码C29ShowWchar1.c
//utf-8编码
#include <stdio.h>
#include <windows.h>
char* unicode2gbk(wchar_t* unicodeStr) {
	int cStrLen = WideCharToMultiByte(CP_ACP, 0, unicodeStr, -1, NULL, 0, NULL, NULL);
	char* cStr = (char*)malloc(sizeof(char) * (cStrLen + 1));
	WideCharToMultiByte(CP_ACP, 0, unicodeStr, -1, cStr, cStrLen + 1, NULL, NULL);
	*(cStr + cStrLen) = '\0';
	return cStr;
}
void main() {
	wchar_t* unicodeStr = L"中国";
	char* gbkStr = unicode2gbk(unicodeStr);
	printf("%s\n", gbkStr);
	getchar();
}
CP_ACP表示windows默认的ANSI code page,对于简体中文就是gbk.按ctrl+F5就能看到"中国"两个汉字.
读取utf8文件的思路就是先按char把文件读到char类型的链表里.读完后把链表里的char放到一个char型的数组里.再把char型的数组转化成unicode.
源代码如下:
https://github.com/zhouyang209117/CppTutorial/blob/master/C/Win32Api/ch02/C22ReadUtf8File.c
参考资料
微软官方文档fopen_s, _wfopen_s
WideCharToMultiByte function
windows程序设计03_读取utf8文件的更多相关文章
- 解決BufferedReader读取UTF-8文件中文乱码
		
解決BufferedReader读取UTF-8文件中文乱码 File rst01 = new File(context.getRealPath("/")+" ...
 - python 读取utf8文件
		
有时候默认是gbk编码,但是要读取utf8文件,所以会出现decode 错误. 使用codecs模块: import codecs file = codecs.open('filename','r', ...
 - 解決BufferedReader读取UTF-8文件中文乱码(转)
		
读取txt文件乱码 BufferedReader read = new BufferedReader(new FileReader(new File(filename))); 解决办法: InputS ...
 - windows下读取utf-8文件
		
#include <stdio.h> #include <tchar.h> #include <memory> int main() { FILE* fp1 = f ...
 - c++ 读取 utf-8 文件到 string
		
#include <iostream> #include <assert.h> #include <fstream> #include <string> ...
 - Java读取Unicode文件(UTF-8等)时碰到的BOM首字符问题,及处理方法
		
转载:https://blog.csdn.net/clementad/article/details/47168573 2015-18-01修改:增加 apache commons io 处理方法. ...
 - Java读取Unicode文件(UTF-8等)时碰到的BOM首字符问题
		
在Windows下用文本编辑器创建的文本文件,如果选择以UTF-8等Unicode格式保存,会在文件头(第一个字符)加入一个BOM标识. 这个标识在Java读取文件的时候,不会被去掉,而且Stri ...
 - Java读取UTF-8格式文件第一行出现乱码——问号“?”及解决 And Java读带有BOM的UTF-8文件乱码原因及解决方法
		
測试样例: Java读取UTF-8的txt文件第一行出现乱码"?"及解决 test.txt文件内容: 1 00:00:06,000 --> 00:00:06,010 < ...
 - 读取xml文件报错:Invalid byte 2 of 2-byte UTF-8 sequence。
		
程序读取xml文件后,系统报“Invalid byte 2 of 2-byte UTF-8 sequence”错误,如何解决呢? 1.程序解析xml的时候,出现Invalid byte 2 of 2- ...
 
随机推荐
- Potato Sacks
			
Potato sacks come in different weight capacities (specified in pounds). Potatoes come in different w ...
 - 关于Prometheus监控的思考:多标签埋点及Mbean
			
使用 grafana+prometheus+jmx 作为普通的监控手段,是比较有用的.我之前的文章介绍了相应的实现办法. 但是,按照之前的实现,我们更多的只能是监控 单值型的数据,如请求量,tps 等 ...
 - go中的关键字-select
			
1. select的使用 定义:在golang里头select的功能与epoll(nginx)/poll/select的功能类似,都是坚挺IO操作,当IO操作发生的时候,触发相应的动作. 1.1 一些 ...
 - 理解Spark运行模式(三)(STANDALONE和Local)
			
前两篇介绍了Spark的yarn client和yarn cluster模式,本篇继续介绍Spark的STANDALONE模式和Local模式. 下面具体还是用计算PI的程序来说明,examples中 ...
 - 并发编程-硬件加持的CAS操作够快么?
			
Talk is cheap CAS(Compare And Swap),即比较并交换.是解决多线程并行情况下使用锁造成性能损耗的一种机制,CAS操作包含三个操作数--内存位置(V).预期原值(A)和新 ...
 - Anaconda 笔记
			
Anaconda笔记 conda 功能 管理版本的切换 安装其他的包 conda 创建python27环境 conda create --name python27 python=2.7 conda ...
 - 【控制系统数字仿真与CAD】实验三:离散相似法数字仿真
			
一.实验目的 1. 了解离散相似法的基本原理 2. 掌握离散相似法仿真的基本过程 3. 应用离散相似法仿真非线性系统 4. MATLAB实现离散相似法的非线性系统仿真 5. 掌握SIMULINK仿真方 ...
 - 线程中synchronized关键字和lock接口的异同
			
一.synchronized关键字 1.可以用来修饰代码块 synchronized (this) { // 同步的关键字 this 表示当前线程对象 if (num == 0) { break; } ...
 - Rust 入门 (二)
			
我认为学习计算机语言,应该先用后学,这一节,我们来实现一个猜数字的小游戏. 先简单介绍一个这个游戏的内容:游戏先生成一个1到100之间的任意一个数字,然后我们输入自己猜测的数字,游戏会告诉我们输入的数 ...
 - vscode启动黑屏
			
今天打开vscode的时候突然就黑屏了,一脸懵 于是上网找了一下,根据这位博主的解决办法: https://blog.csdn.net/insgo/article/details/102975986 ...