C++处理中文字符

C++处理中文的问题困扰我很久了。之前一旦遇到中文基本就投诸java怀抱了。

今天看到一个漂亮的c++程序,遂豁然开朗。总结一下分享给大家:

 

问题描述:

c++ 中 char*/string 形式的字符串无法正确的对中文字符串进行处理(如 find, strlen, substr 等常规操作) 。

比如当你在char* 中 find 英文逗号时,有可能匹配的不只是逗号,还找到了某个汉字的一个字节,而你无法在char*中区分它们。

 

问题原因:

中文字符长度不固定,按字节处理往往出现乱码或错误分割。在unicode中每个中文为2个字节,而中文中间夹杂的英文和半角标点则仍然是1个字节。

 

解决方案:

构造三层逻辑结构:输入层、逻辑处理层、输出层。

   -- 输入层接收char*输入,并将其转换为wchar*.

   -- 逻辑处理层在 wchar* 或 wstring 的基础上进行字符串操作,此时操作最小单位为中文字符,不会再有乱码。

   -- 输出层将wchar*的结果再次转换为char* ,返回给外部。

这样,对外部来说,仍然是输入char*, 输出char*, 但在这个过程中不再有分割汉字的操作或乱码。

 

核心转换代码:

#include 
#include 
using namespace std;

wchar_t* MBCS2Unicode(wchar_t * buff, const char * str)
{
	wchar_t * wp = buff;
	char * p = (char *)str;
	while (*p)
	{
		if (*p & 0x80)
		{
			*wp = *(wchar_t *)p;
			p++;
		}
		else {
			*wp = (wchar_t)*p;
		}
		wp++;
		p++;
	}
	*wp = 0x0000;
	return buff;
}

char * Unicode2MBCS(char * buff, const wchar_t * str)
{
	wchar_t * wp = (wchar_t *)str;
	char * p = buff, *tmp;
	while (*wp) {
		tmp = (char *)wp;
		if (*wp & 0xFF00) {
			*p = *tmp;
			p++; tmp++;
			*p = *tmp;
			p++;
		}
		else {
			*p = *tmp;
			p++;
		}
		wp++;
	}
	*p = 0x00;
	return buff;
}

wstring str2wstr(string str)
{
	size_t len = str.size();
	wchar_t * b = (wchar_t *)malloc((len + 1) * sizeof(wchar_t));
	MBCS2Unicode(b, str.c_str());
	wstring r(b);
	free(b);
	return r;
}
int wputs(const wchar_t * wstr);
int wputs(wstring wstr)
{
	wputs(wstr.c_str());
	return 0;
}

int wputs(const wchar_t * wstr)
{
	int len = wcslen(wstr);
	char * buff = (char *)malloc((len * 2 + 1) * sizeof(char));
	Unicode2MBCS(buff, wstr);
	printf("%s", buff);
	free(buff);
	return 0;
}

string wstr2str(wstring wstr)
{
	size_t len = wstr.size();
	char * b = (char *)malloc((2 * len + 1) * sizeof(char));
	Unicode2MBCS(b, wstr.c_str());
	string r(b);
	free(b);
	return r;
}

int main()
{
	//输入层:接收char*输入,并将其转换为wchar*
	string input = "今天你在武汉!!";
	string temp = "在";
	
	//逻辑层在whcar*或wstring的基础上进行字符串操作,此时操作最小单位为中文字符,不会再有乱码。
	wstring buff = str2wstr(input);
	wstring temp_buff = str2wstr(temp);
	cout << "input的中文个数:"<

 

你可能感兴趣的:(C++)