作者: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等字符串的更多相关文章

  1. 使用SQL如何把用逗号等字符隔开的字符串转换成列表(转)

    如何把用逗号等字符隔开的字符串转换成列表,下面依逗号分隔符为例: 比如有一个字符串,其值为:香港,张家港,北京,上海用SQL把这个字符串转换成列表的方法是: 1.方法一 WITH A AS (SELE ...

  2. php 把驼峰样式的字符串转换成下划线样式的字符串

    1.如何在php中把驼峰样式的字符串转换成下划线样式的字符串.例:输入是FooBar的话,输出则是foo_bar 以下是用正则的方式去完成,既然用到正则,方法肯定就不只一种,我们看下下面的方式 ech ...

  3. 《剑指offer》第六十七题(把字符串转换成整数)

    // 面试题67:把字符串转换成整数 // 题目:请你写一个函数StrToInt,实现把字符串转换成整数这个功能.当然,不 // 能使用atoi或者其他类似的库函数. #include <ios ...

  4. [Leetcode] String to integer atoi 字符串转换成整数

    Implement atoi to convert a string to an integer. Hint: Carefully consider all possible input cases. ...

  5. 05 HTML字符串转换成jQuery对象、绑定数据到元素上

    1 要求 将一段 HTML脚本 封装成一个字符串,将这个字符串转换成一个jQuery对象:然后将这个jQuery对象添加到指定的元素中去 2 步骤 定义字符串 var str = '<div i ...

  6. 前端与算法 leetcode 8. 字符串转换整数 (atoi)

    目录 # 前端与算法 leetcode 8. 字符串转换整数 (atoi) 题目描述 概要 提示 解析 解法一:正则 解法二:api 解法二:手搓一个api 算法 传入测试用例的运行结果 执行结果 G ...

  7. python3.4学习笔记(二十二) python 在字符串里面插入指定分割符,将list中的字符转为数字

    python3.4学习笔记(二十二) python 在字符串里面插入指定分割符,将list中的字符转为数字在字符串里面插入指定分割符的方法,先把字符串变成list然后用join方法变成字符串str=' ...

  8. C标准库-数值字符串转换与内存分配函数

    原文链接:http://www.orlion.ga/977/ 一.数值字符串转换函数 #include <stdlib.h> int atoi(const char *nptr); dou ...

  9. ATL字符串转换宏

    有比MultiByteToWideChar和WideCharToMultiByte更简单的字符串转换宏,你相信吗?头文件 d:\program files\microsoft visual studi ...

随机推荐

  1. mybatis 控制台打印sql

    开发时调试使用 <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBe ...

  2. perl 对源文件内容修改 方法整理

    1, 利用Tie::File模块来直接对文件内容进行修改. #!/usr/bin/perl -w my $std="F160"; my $fast="FAST" ...

  3. JAVA的JNI调用

    由于JNI调用C和调用C++差不多,而且C++中可以混合写C代码,所以这里主要是写关于JNI调用C++的部分. 一般步骤: 先是写普通的Java类,其中包括本地方法调用.  然后编译这个Java类,调 ...

  4. sqlplus启动后的环境SQLPATH的设置

    sqlplus启动时会查找和加载的两个文件login.sql和glogin.sql.其中glogin.sql文件默认存放在$ORACLE_HOME/sqlplus/admin目录下,login.sql ...

  5. 项目学习——电力系统底层架构ssh

    电力系统底层架构1.建立web工程 创建数据库 导入向对应的jar包2. 持久层: (1)在cn.itcast.elec.domain中创建持久化类ElecText @SuppressWarnings ...

  6. Asp.Net Web API 2第一课——入门

    详情请查看http://aehyok.com/Blog/Detail/68.html 个人网站地址:aehyok.com QQ 技术群号:206058845,验证码为:aehyok 本文文章链接:ht ...

  7. [MFC] MFC 仿 Flappy bird PC桌面版

    http://www.cr173.com/ 前些日子发现朋友都在玩flappy bird这款虐心的小游戏,网上也炒得很火,于是俺也想下一个玩玩.可是矮穷挫至今还没配上高端的智能机,于是去网上搜了一下, ...

  8. html5之canvas画图

    导航 前言 基本知识 绘制矩形 清除矩形区域 圆弧 路径 绘制线段 绘制贝塞尔曲线 线性渐变 径向渐变(发散) 图形变形(平移.旋转.缩放) 矩阵变换(图形变形的机制) 图形组合 给图形绘制阴影 绘制 ...

  9. centos基本操作

    yum install nodejs npm install -g shadowsocks nohup ssserver & 后台运行 vi /usr/lib/node_modules/sha ...

  10. jquery判断页面滚动条(scroll)是上滚还是下滚,且是否滚动到头部或者底部

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...