作者:zyl910
如今,UTF-8字符串的使用频率越来越多了。但是在VC中,不能直接处理UTF-8字符串,得专门去写UTF-8与窄字符串、宽字符串、TCHAR字符串相互转换的代码。不仅费时费力,而且稍不留心就容易造成内存泄露问题。于是我便想专门编写个库来解决UTF-8字符串编码问题。
特性——
支持 TCHAR,能随时切换项目字符集配置。
兼容 32位(x86)与64位(x64)Windows环境。
兼容 VC2005 及更高版本的 VC。
一、设计思路
ATL中的字符串转换宏用起来很方便,于是我打算参考它,做一套字符串转换宏。
转换宏的命名规则——
C<SourceType>2[C]<DestinationType>[EX]
<SourceType>、<DestinationType>:字符串类型。可以为 A(char), W(wchar_t), T(TCHAR), U8(UTF-8) 。
[C]:是否是常量。
[EX]:是不是加强版。即是否具有 t_nBufferLength 这样的模板参数。
例如常用转换宏有——
CU82A: 将 UTF-8字符串 转为 窄字符串。
CA2U8: 将 窄字符串 转为 UTF-8字符串。
CU82W: 将 UTF-8字符串 转为 宽字符串。
CW2U8: 将 宽字符串 转为 UTF-8字符串。
CU82T: 将 UTF-8字符串 转为 TCHAR字符串。
CT2U8: 将 TCHAR字符串 转为 UTF-8字符串。
二、范例代码
范例代码——
#include <stdio.h> #include <locale.h> #include <tchar.h> #include "zlatlcv.h" // "Welcome": English, Traditional Chinese, Japanese, Korean. const char* psa = "A_Welcome_歡迎_ようこそ_환영."; //!< UTF-8 string( Auto. File used UTF-8 encoding). const wchar_t* psw = L"W_Welcome_\u6B61\u8FCE_\u3088\u3046\u3053\u305D_\uD658\uC601."; //!< Wide char string. int _tmain(int argc, _TCHAR* argv[]) { // init. setlocale(LC_ALL, ""); // 使用客户环境的缺省locale. // title. _tprintf(_T("zlatlcv v1.0 (%dbit)\n"), (int)(8*sizeof(int*))); _tprintf(_T("sizeof(wchar_t): %d\n"), (int)(sizeof(wchar_t))); _tprintf(_T("sizeof(TCHAR): %d\n"), (int)(sizeof(TCHAR))); _tprintf(_T("\n")); // printf. fflush(stdout); printf("printf A:\t%s\n", psa); printf("printf W:\t%ls\n", psw); printf("\n"); // UTF-8 to string (UTF-8 转 各种字符串). //CA2AZ psaa(psa, CP_UTF8, 0); CU82A psaa(psa); CU82W psaw(psa); printf("printf A from UTF-8:\t%s\n", psaa); printf("printf W from UTF-8:\t%ls\n", psaw); printf("\n"); // string to UTF-8 (各种字符串 转 UTF-8). CA2U8 psau8(psaa); CW2U8 pswu8(psaw); fflush(stdout); printf("printf UTF-8 from A:\t%s\n", psau8); printf("printf UTF-8 from W:\t%s\n", pswu8); // _tprintf. CA2CT psat(psa); CW2CT pswt(psw); CU82T psu8t(psa); fflush(stdout); _tprintf(_T("_tprintf A:\t%s\n"), psat); _tprintf(_T("_tprintf W:\t%s\n"), pswt); _tprintf(_T("_tprintf U8:\t%s\n"), psu8t); return 0; }
运行效果——
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· C++代码改造为UTF-8编码问题的总结
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 实操Deepseek接入个人知识库
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库