[C++] zlatlcv: ATL字符串转换辅助库。能很方便的将UTF-8字符串转为TCHAR等字符串
作者: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)(*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 ;
}
运行效果——
源码下载——
https://github.com/zyl910/zlatlcv
[C++] zlatlcv: ATL字符串转换辅助库。能很方便的将UTF-8字符串转为TCHAR等字符串的更多相关文章
- 使用SQL如何把用逗号等字符隔开的字符串转换成列表(转)
如何把用逗号等字符隔开的字符串转换成列表,下面依逗号分隔符为例: 比如有一个字符串,其值为:香港,张家港,北京,上海用SQL把这个字符串转换成列表的方法是: 1.方法一 WITH A AS (SELE ...
- php 把驼峰样式的字符串转换成下划线样式的字符串
1.如何在php中把驼峰样式的字符串转换成下划线样式的字符串.例:输入是FooBar的话,输出则是foo_bar 以下是用正则的方式去完成,既然用到正则,方法肯定就不只一种,我们看下下面的方式 ech ...
- 《剑指offer》第六十七题(把字符串转换成整数)
// 面试题67:把字符串转换成整数 // 题目:请你写一个函数StrToInt,实现把字符串转换成整数这个功能.当然,不 // 能使用atoi或者其他类似的库函数. #include <ios ...
- [Leetcode] String to integer atoi 字符串转换成整数
Implement atoi to convert a string to an integer. Hint: Carefully consider all possible input cases. ...
- 05 HTML字符串转换成jQuery对象、绑定数据到元素上
1 要求 将一段 HTML脚本 封装成一个字符串,将这个字符串转换成一个jQuery对象:然后将这个jQuery对象添加到指定的元素中去 2 步骤 定义字符串 var str = '<div i ...
- 前端与算法 leetcode 8. 字符串转换整数 (atoi)
目录 # 前端与算法 leetcode 8. 字符串转换整数 (atoi) 题目描述 概要 提示 解析 解法一:正则 解法二:api 解法二:手搓一个api 算法 传入测试用例的运行结果 执行结果 G ...
- python3.4学习笔记(二十二) python 在字符串里面插入指定分割符,将list中的字符转为数字
python3.4学习笔记(二十二) python 在字符串里面插入指定分割符,将list中的字符转为数字在字符串里面插入指定分割符的方法,先把字符串变成list然后用join方法变成字符串str=' ...
- C标准库-数值字符串转换与内存分配函数
原文链接:http://www.orlion.ga/977/ 一.数值字符串转换函数 #include <stdlib.h> int atoi(const char *nptr); dou ...
- ATL字符串转换宏
有比MultiByteToWideChar和WideCharToMultiByte更简单的字符串转换宏,你相信吗?头文件 d:\program files\microsoft visual studi ...
随机推荐
- C# 字符串替换Replace
C# 中的石strA.Replace(strB,strC)函数可以实现将strA中的strB替换为strC. 但是容易出错的地方是,这并不是就直接替换好了,此函数的返回值才是替换好的字符串,所以还要要 ...
- Android开源框架——Picasso
开篇——介绍Picasso (Picasso是什么?)Picasso:A Powerfull Image Downloading and Caching Library for Android,即An ...
- HashMap源码解析
本文转载摘录自http://www.importnew.com/20386.html Java为数据结构中的映射定义了一个接口java.util.Map,此接口主要有四个常用的实现类,分别是HashM ...
- 转:dashboard的简明教程
在网上看到一篇不错的dashboard入门blog,在此就不在copy,贴地址: http://www.open-open.com/lib/view/open1389792987430.html 可以 ...
- Fragment的基本用法
一.Fragment主要用到的API: 1.Fragment 类-----用来创建碎片 2.FragmentManager 类 ----为管理Activity中Fragment,用于Activity与 ...
- 使用页面Tag判断某个值为空值时,不能使用logic:equal(无效),可以使用logic:notPresent
使用页面Tag判断某个值为空值时,不能使用logic:equal(无效),可以使用logic:notPresent
- Data层相关问题 & JS循环取值
第一次写博客,里面是自己工作中碰到的问题及总结的知识点,便于自己以后回顾,技术大牛们请直接忽略这篇文章,也希望能帮助到想我这样的小白! Data层相关问题总结: 1. 代码管理用的是 VSS 2005 ...
- ASP.NET Core 源码阅读笔记(2) ---Microsoft.Extensions.DependencyInjection生命周期管理
在上一篇文章中我们主要分析了ASP.NET Core默认依赖注入容器的存储和解析,这一篇文章主要补充一下上一篇文章忽略的一些细节:有关服务回收的问题,即服务的生命周期问题.有关源码可以去GitHub上 ...
- ActiveMQ第四弹:在HermesJMS中创建ActiveMQ Session
Hermes JMS是一个开源免费的跨平台的JMS消息监听工具.它可以很方便和各种JMS框架集成和交互,可以用来监听.发送.接收.修改.存储消息等.这篇文章将讲解HermesJMS如何集成Active ...
- AngularJS快速入门指南04:指令
AngularJS通过指令将HTML属性进行了扩展. AngularJS指令 AngularJS指令是带有ng-前缀的扩展HTML属性. ng-app指令用来初始化AngularJS applicat ...