`

utf8 ansi unicode 字符相互转化

    博客分类:
  • VC
 
阅读更多

 

#include "lang.h"
#include <assert.h>
#include <new>
using namespace std;

LPWSTR Utf8ToUnicode(LPSTR lpszUtf8, DWORD& dwBufLen)
{
	assert(lpszUtf8);
	LPWSTR lpwBuf = NULL;

	try
	{
		//得到转换后的字符串长度
		dwBufLen = MultiByteToWideChar(CP_UTF8, 0, lpszUtf8, -1, NULL, NULL);
		
		//new buffer
		lpwBuf = new(nothrow) wchar_t[dwBufLen];
		if (NULL == lpwBuf)
		{
			return NULL;
		}

		memset(lpwBuf, 0, dwBufLen * sizeof(wchar_t));
	
		MultiByteToWideChar(CP_UTF8, 0, lpszUtf8, -1, lpwBuf, dwBufLen);
	}
	catch (...)
	{
		return NULL;
	}

	return lpwBuf;	
}

LPSTR UnicodeToUtf8(LPWSTR lpwBuf, DWORD& dwBufLen)
{
	assert(lpwBuf);
	LPSTR lpszUtf8 = NULL;

	try
	{
		//得到转换后的字符串长度
		dwBufLen = WideCharToMultiByte(CP_UTF8, 0, lpwBuf, -1, NULL, 0, NULL, NULL);

		lpszUtf8 = new(nothrow) char[dwBufLen];
		if (NULL == lpszUtf8)
		{
			return lpszUtf8;
		}

		memset(lpszUtf8, 0, dwBufLen);

		WideCharToMultiByte(CP_UTF8, 0, lpwBuf, -1, lpszUtf8, dwBufLen, NULL, NULL);
	}
	catch (...)
	{
		return NULL;
	}

	return lpszUtf8;
}

LPSTR UnicodeToAnsi(LPWSTR lpwBuf, DWORD& dwBufLen)
{
	assert(lpwBuf);
	LPSTR lpszBuf = NULL;

	try
	{
		//得到转换后的字符串长度
		dwBufLen = WideCharToMultiByte(CP_ACP, 0, lpwBuf, -1, NULL, 0, NULL, NULL);

		lpszBuf = new(nothrow) char[dwBufLen];
		if (NULL == lpszBuf)
		{
			return lpszBuf;
		}

		memset(lpszBuf, 0, dwBufLen);

		WideCharToMultiByte(CP_ACP, 0, lpwBuf, -1, lpszBuf, dwBufLen, NULL, NULL);
	}
	catch (...)
	{
		return NULL;
	}

	return lpszBuf;
}


LPWSTR AnsiToUnicode(LPSTR lpszBuf, DWORD& dwBufLen)
{
	assert(lpszBuf);
	LPWSTR lpwBuf = NULL;

	try
	{
		dwBufLen = MultiByteToWideChar(CP_ACP, 0, lpszBuf, -1, NULL, 0);
		//new buffer
		lpwBuf = new(nothrow) wchar_t[dwBufLen];
		if (NULL == lpwBuf)
		{
			return NULL;
		}

		memset(lpwBuf, 0, dwBufLen * sizeof(wchar_t));

		MultiByteToWideChar(CP_ACP, 0, lpszBuf, -1, lpwBuf, dwBufLen);
	}
	catch (...)
	{
		return NULL;
	}
	
	return lpwBuf;
}

LPSTR AnsiToUtf8(LPSTR lpszBuf, DWORD& dwBufLen)
{
	assert(lpszBuf);
	LPSTR lpszUtf8 = NULL;

	try
	{
		LPWSTR lpwBuf = AnsiToUnicode(lpszBuf, dwBufLen);
		if (NULL == lpwBuf)
		{
			return NULL;
		}

		lpszUtf8 = UnicodeToUtf8(lpwBuf, dwBufLen);

		//release
		delete[] lpwBuf;
		lpwBuf = NULL;
	}
	catch (...)
	{
		return NULL;
	}

	return lpszUtf8;
}

LPSTR Utf8ToAnsi(LPSTR lpszUtf8, DWORD& dwBufLen)
{
	assert(lpszUtf8);
	LPSTR lpszBuf = NULL;

	try
	{
		LPWSTR lpwBuf = Utf8ToUnicode(lpszUtf8, dwBufLen);
		if (NULL == lpwBuf)
		{
			return NULL;
		}

		lpszBuf = UnicodeToAnsi(lpwBuf, dwBufLen);

		//release buff
		delete[] lpwBuf;
		lpwBuf = NULL;
	}
	catch (...)
	{
		return NULL;
	}

	return lpszBuf;
}
分享到:
评论

相关推荐

    C语言UTF8到ANSI和Unicode转换代码

    本文将深入探讨C语言中UTF8、ANSI和Unicode字符集之间的转换方法,以及如何在MFC(Microsoft Foundation Classes)项目中集成这些转换代码。 首先,我们要了解UTF8、ANSI和Unicode的概念。UTF8是一种变长的Unicode...

    utf-8 ansi 字符互转 工具

    1. **UTF-8**:全称为“Unicode Transformation Format - 8”,是一种变长的字符编码,可以表示Unicode字符集中的所有字符。UTF-8最显著的特点是它对英文字符使用单字节,而对其他语言(如中文、日文等)使用多字节...

    Ansi Unicode UTF8编码转换及代码示例

    1. **从ANSI到Unicode**:首先需要确定ANSI编码类型,然后使用相应的转换函数将ANSI字符集转换成Unicode字符集。在Windows平台上,可以使用`MultiByteToWideChar`函数实现这一过程。 2. **从Unicode到ANSI**:这个...

    utf-8、ANSI、Unicode相互转化c++实现

    utf-8、ANSI、Unicode相互转化c++实现 std::string ConverANSI2UTF8(const std::string & str); std::wstring ConverANSI2Unicode(const std::string str); std::wstring ConverUTF82Unicode(const std::string str)...

    字符编码转换类,支持 ANSI、Unicode、Unicode big endian、UTF-8、UTF-8+Bom互相转换

    1. ANSI编码:通常指的是Windows系统的默认编码,如GBK或CP936,它是一种多字节编码,不支持所有Unicode字符。 2. Unicode:这是一个标准,定义了所有已知字符的唯一数字表示,分为Little Endian和Big Endian两种...

    Ansi、Unicode、UTF8字符串之间的转换,wprintf

    在 Windows 操作系统中,常见的字符串编码方式有三种:Ansi、Unicode 和 UTF8。今天我们将详细介绍这三种编码方式之间的转换,包括 Ansi 转 Unicode、Unicode 转 Ansi,以及使用 wprintf 函数进行字符串输出。 Ansi...

    lua utf8 unicode ansi 转换

    require "lc" print(lc.help());... u2w(utf8 to unicode) w2a(unicode to ansi) w2u(unicode to utf8) u2a(utf8 to ansi) a2u(ansi to utf8) bstr(bytes of str) help(show this) wunoman@qq.com 2012/03/06

    ANSI UNICODE UTF8转换

    UTF-8的优点在于它兼容ASCII,前128个Unicode字符与ASCII相同,只需要1个字节表示。同时,UTF-8在互联网上广泛使用,因为它具有较好的向后兼容性和网络传输效率。 在你的项目中,`MyCodeConvert.cpp`和`...

    编码方式 UTF8 ANSI UNICODE

    UTF-8是最广泛使用的Unicode实现方式,它是一种变长编码,能够表示Unicode字符集中所有的字符。UTF-8的优点在于其向前兼容ASCII码,对于英文字符,它与ASCII码完全一致,因此在网络传输和存储中非常高效。在Qt开发中...

    封装ANSI,UNICODE,UTF8互相转换类

    "封装ANSI,UNICODE,UTF8互相转换类"是一个专门解决字符编码转换问题的工具,尤其适用于处理多语言环境下的文本数据。以下是对这些编码方式以及它们之间转换的详细解释: 1. ANSI 编码:ANSI(American National ...

    UTF-8转ANSI文本文件转换器

    UTF-8(Unicode Transformation Format - 8 bit)是一种广泛使用的变长字符编码,它能够表示Unicode字符集中的所有字符。UTF-8的特点是前几个常用的ASCII字符(如英文字符)使用单字节编码,而其他非ASCII字符则使用...

    UTF8,ANSI,UTF7,UNICODE,UTF32等字符集字符串与字节数组互转工具

    UTF8是最常见的Unicode编码形式,它以1到4个字节来表示一个Unicode字符。对于ASCII字符(0-127),UTF8仅使用一个字节,这样兼容了原来的ASCII编码,使得处理英文文本更为高效。其他Unicode字符则需要更多的字节,...

    ANSI字符串与Unicode字符串的相互转换

    本篇文章将详细探讨ANSI字符串与Unicode字符串的相互转换及其重要性。 首先,我们要理解ANSI字符串的概念。ANSI字符串实际上是一个历史遗留的术语,它通常指的是基于特定区域设置的本地化ASCII扩展编码,如Windows...

    Qt中的字符编码转换:UTF8、Unicode、GBK、ASCII、16进制字符、16进制数值

    但如果需要,可以使用`QString::toUtf8()`将Unicode字符串转换为UTF-8字节序列。 5. **16进制数值转换**:在串口通信中,可能需要将接收到的16进制数值转换为字符或字符串。例如,函数`QByteArray_to_HexQString`将...

    多字节与UTF-8、Unicode之间的转换

    2. **UTF-8**:UTF-8是一种可变长度的字符编码,它可以用于编码所有Unicode字符,并且兼容ASCII编码。对于英文等使用较少字节就能表示的文字,UTF-8非常高效。 3. **Unicode**:Unicode是一种标准,旨在为世界上所有...

    UTF8与ansi string转换处理(DELPHI7开发)

    标题中的"UTF8与ansi string转换处理(DELPHI7开发)"指的是在DELPHI7这个版本的编程环境中,如何处理两种不同编码类型的字符串——UTF8和ANSI。UTF8是一种广泛使用的Unicode编码,可以表示世界上几乎所有的字符;而...

    [C语言]字符串处理 - ANSI - Unicode - UTF8 转换

    ASCII字符(7位)在UTF-8中仍用1个字节表示,其他Unicode字符使用2到4个字节。UTF-8的优点在于它向后兼容ASCII,且在Web上广泛使用。 在C语言中,处理这些编码转换的关键是理解字节序列和字符的关系。以下是一些...

    Delphi中UTF-8,Unicode格式转换

    delphi7调用delphi2009生成的dll文件会出现乱码问题。是unicode的原因 终于找到了UTF-8、Unicode格式转换函数

    C++Builder String,UNICODE,UTF8,ANSI互转的类.rar_c

    - `Utf8ToUnicode`: 将UTF-8字符串转换为Unicode字符串。 - `UnicodeToUtf8`: 将Unicode字符串转换为UTF-8字符串。 6. **注意事项** 进行字符串转换时,必须注意编码的正确性和一致性,尤其是在处理多语言文本...

Global site tag (gtag.js) - Google Analytics