[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)(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;
}

运行效果——

源码下载——
https://github.com/zyl910/zlatlcv

时间: 2024-10-13 12:13:31

[C++] zlatlcv: ATL字符串转换辅助库。能很方便的将UTF-8字符串转为TCHAR等字符串的相关文章

程序员面试50题(4)—把字符串转换成整数[算法]

题目:输入一个表示整数的字符串,把该字符串转换成整数并输出.例如输入字符串"345",则输出整数345. 分析:这道题尽管不是很难,学过C/C++语言一般都能实现基本功能,但不同程序员就这道题写出的代码有很大区别,可以说这道题能够很好地反应出程序员的思维和编程习惯,因此已经被包括微软在内的多家公司用作面试题.建议读者在往下看之前自己先编写代码,再比较自己写的代码和下面的参考代码有哪些不同. 首先我们分析如何完成基本功能,即如何把表示整数的字符串正确地转换成整数.还是以"345

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

如何把用逗号等字符隔开的字符串转换成列表,下面依逗号分隔符为例: 比如有一个字符串,其值为:香港,张家港,北京,上海用SQL把这个字符串转换成列表的方法是: 1.方法一 WITH A AS (SELECT '香港,张家港,北京,上海' A FROM DUAL) SELECT DECODE(B,0,SUBSTR(A,C),SUBSTR(A,C,B-C)) city FROM ( SELECT A,B,(LAG(B,1,0) OVER(ORDER BY LV))+1 C FROM( SELECT A

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

Implement atoi to convert a string to an integer. Hint: Carefully consider all possible input cases. If you want a challenge, please do not see below and ask yourself what are the possible input cases. Notes: It is intended for this problem to be spe

strtoul字符串转换函数

原型:unsigned long int strtoul(const char *nptr,char **endptr,int base); 相关函数 atof,atoi,atol,strtod,strtoul 头文件:stdlib.h 功能:将字符串转换成无符号长整型数 说明: strtoul()会将参数nptr字符串根据参数base来转换成无符号的长整型数.参数base范围从2至36,或0.参数base代表采用的进制方式,如base值为10则采用10进制,若base值为16则采用16进制数等

json对象与字符串转换

//使用json中的parser方法转换: var str='{"name":"fendouer", "age":23}'; //这是一个json字符串'' var ob=JSON.parse(str) ; //返回一个新对象 console.log(ob.name) //把json中的stringify对象转换成字符串 var obj={"student":[{"name":"cyl"

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

// 面试题67:把字符串转换成整数 // 题目:请你写一个函数StrToInt,实现把字符串转换成整数这个功能.当然,不 // 能使用atoi或者其他类似的库函数. #include <iostream> long long StrToIntCore(const char* str, bool minus); enum Status { kValid = 0, kInvalid }; int g_nStatus = kValid;//设置全局错误变量,用来反映无效输入 int StrToIn

剑指Offer对答如流系列 - 把字符串转换成整数

面试题67:把字符串转换成整数 题目描述 请你写一个函数StrToInt,实现把字符串转换成整数这个功能.当然,不能使用库函数. 问题分析 既然不能使用库函数,那么我们就利用字符的ASCII值,将字符转换成数字,并进行累加. 问题解答 // 标识输入非法 boolean isValid = false; public int strToInt(String str) { if(str == null || str.length()<=0) { return 0; } char[] chars =

谈ATL(一)--说说ATL字符串转换类

大家在使用ATL技术做项目时,一定发现了非常麻烦的字符串字符集问题,下面把常用点和重点记录罗列一下,以备查. ATL提供了许多字符串转换函数,如果编译选项使得源和目的的字符类型相同,那么这些类不执行任何转换,关于设置系统编译项的问题前面windows编程的文章中已经介绍过.如果要使用ATL的字符转换类,那么必须要包含<atlconv.h>文件,转换的具体方式均是通过宏定义(宏函数)来完成,为了更好的列出这些宏函数及明确其功能,需要先说明一下都有哪些字符串类型以及他们的缩写形式: T表示一个指向

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

原文链接:http://www.orlion.ga/977/ 一.数值字符串转换函数 #include <stdlib.h> int atoi(const char *nptr); double atof(const char *nptr); 返回值:转换结果 atoi把一个字符串开头可以识别成十进制整数的部分转换成int型,例如atoi("   -123abc")返回-123(字符串开头可以有空格).如果字符串开头没有可识别的整数返回0,而atoi("0abc&