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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义