`

char和wchar_t互转的操作类

    博客分类:
  • c++
c++ 
阅读更多

//@file widechar.h
//@author norkts<norkts@gmail.com>

class WideChar{
public:
	WideChar();
	WideChar(const wchar_t* in);
	WideChar(const char* in);
	~WideChar();

	char* toChar(){
		return data;
	}

	wchar_t* toWchar(){
		return wdata;
	}

	int size(){
		return _size;
	}

	int wsize(){
		return _wsize;
	}

	void operator=(const wchar_t* in){
		delete[] wdata;
		delete[] data;

		assign(in);
	}

	void operator=(const char* in){
		delete[] wdata;
		delete[] data;

		assign(in);
	}

private:
	void assign(const wchar_t* in);
	void assign(const char* in);
private:
	wchar_t* wdata;
	char* data;
	int _wsize = 0;
	int _size = 0;
};



//@file widechar.cpp
//@author norkts<norkts@gmail.com>

#include "WideChar.h"
WideChar::WideChar(){

}

WideChar::WideChar(const wchar_t* in){
	assign(in);
}

WideChar::WideChar(const char* in){
	assign(in);
}

WideChar::~WideChar(){
	delete[] data;
	delete[] wdata;
}

void WideChar::assign(const wchar_t* in){
	_wsize = wcslen(in);

	wdata = new wchar_t[_wsize + 1];
	wmemset(wdata, 0, _wsize + 1);
	wmemcpy(wdata, in, _wsize);

	_size = _wsize * 2;
	data = new char[_size + 1];
	memset(data, 0, _size + 1);

	WideCharToMultiByte(CP_ACP, 0, wdata, -1, data, _size, NULL, NULL);

	_size = strlen(data);
}

void WideChar::assign(const char* in){
	_size = strlen(in);
	data = new char[_size + 1];
	memset(data, 0, _size + 1);
	memcpy(data, in, _size);

	_wsize = _size * 2;

	wdata = new wchar_t[_wsize + 1];
	wmemset(wdata, 0, _wsize + 1);

	MultiByteToWideChar(CP_ACP, 0, data, -1, wdata, _size);

	_wsize = wcslen(wdata);
}
分享到:
评论

相关推荐

    VC++对字符串处理

    VC++ MFC里定义了一些宏,例如LPCTSTR表示const TCHAR*,LPTSTR表示TCHAR*,LPSTR表示char*,LPWSTR表示wchar_t*,LPCSTR表示const char*,LPCWSTR表示const wchar_t*。总之就是LP表示指针,C表示const,STR表示char...

    定长字符串模板类

    针对char和wchar_t(我特讨厌这后面的_t这根尾巴)两种字符类型的基类的和默认traits 的typedef.写函数参数类型的时候可以少写几个字, ^=^ 4. template &lt;;size_t MaxSize, typename Traits=std::char_...

    unicode、utf-8、ansi的故事及其相互转换.txt

    Unicode字符串,每个字符(汉字、英文字母)都占2个字节,以2个连续的\0结尾,NT操作系统内核用的是这种字符串,常被定义为typedef unsigned short wchar_t;所以我们有时常会见到什么char*无法转换为unsigned short*之...

    c++11中regex正则表达式示例简述

    以std::string为代表的处理字符串的类型(我们知道还有存储wchar_t的wstring类、原生c式字符串const char*等等,为了简化处理仅介绍std::string类型相关的操作,当你把握住了regex的主脉络之后,想使用其他的版本...

    新手学习C++入门资料

    在C++中还增加了bool型变量和wchar_t型变量: 布尔型变量是有两种逻辑状态的变量,它包含两个值:真和假。如果在表达式中使用了布尔型变量,那么将根据变量值的真假而赋予整型值1或0。要把一个整型变量转换成布尔...

    cpp-rope:C ++中的绳索实现

    尽管C ++ STL中已有绳索的实现,但是该实现仅限于使用char或wchar作为基础类型的绳索。 此外,STL实现不支持Unicode,这增加了使用UTF-8字符串的复杂性(例如,按单词/代码点进行迭代)。 此实现同时提供了两者。 ...

    Tinyxml 源代码(VC6 & VS2005)

    TinyXML使用文档对象模型(DOM),这意味着XML数据被解析成一个可被浏览和操作的C++对象,然后它可以被写到磁盘或者另一个输出流中。你也可以把C++对象构造成一个XML文档然后把它写到磁盘或者另一个输出流中。 ...

    补丁模块(带源码)InlinePatch,Hook,内存DLL注入等等

    下面这个模块是我使用易语言时写补丁最常用的一个模块(当然很多也是抄的),一开始我觉得bug肯定会很多,放出去肯定又会坑很多人,后来我发现坑坑更健康,当你明白一个东西的优缺点之后,你才会更好的选择你所需要...

    C/C++头文件大全

    int spawnvpe int mode char pathname char argv[] char envp[] spawn函数族在mode模式下运行子程序pathname 并将参数 arg0 arg1 arg2 argv[] envp[] 传递给子程序 出错返回 1 mode为运行模式 mode为 P WAIT ...

    网管教程 从入门到精通软件篇.txt

    AIF,AIFF:音频互交换文件,Silicon Graphic and Macintosh应用程序的声音格式 ANI:Windows系统中的动画光标 ARC:LH ARC的压缩档案文件 ARJ:Robert Jung ARJ压缩包文件 ASD:Microsoft Word的自动保存文件;...

Global site tag (gtag.js) - Google Analytics