各种字符编码间的转换方法:MultiByteToWideChar和MultiByteToWideChar

合集下载

Windows和Linux的字符编码转换

Windows和Linux的字符编码转换

前谈过一篇关于Linux下面Unicode使用的文章。

那个主要是针对多字节和宽字符的转换而谈的。

今天说的有些类似,主要是windows下面关于字符编码转换和Linux下面的不同。

我移植的那部分程序中,有函数是用来实现UTF-8和GBK之间的转换的。

其实其他很多不同类型的字符之间转换都可以用这种方法。

先说windows。

因为windows下面没有函数可以实现这一功能,所以得自己写。

思路很简单,就是利用之前讲过的那两个函数来实现,即:MultiByteToWideChar和WideCh arToMultiByte来实现。

先将其中一种编码(如UTF-8)利用MultiByteToWideChar转换为宽字节,然后再利用WideCharToMultiByte转换为另一种编码(如GBK)。

反过来也是一样的。

下面给出代码:LONG UTF8ToGBK(const void * lpUTF8Str, string & str){if(lpUTF8Str == NULL) return -1;int nRetLen = 0;//获取转换到Unicode编码后所需要的字符空间长度nRetLen = ::MultiByteToWideChar(CP_UTF8, 0,(char *)lpUTF8Str, -1, NULL, NULL);WCHAR *lpUnicodeStr = new WCHAR[nRetLen + 1];//为Unicode字符串空间//转换到Unicode编码nRetLen = ::MultiByteToWideChar(CP_UTF8, 0,(char *)lpUTF8Str, -1, lpUnicodeStr, nRetLen);if(!nRetLen){delete []lpUnicodeStr; return -1;}//获取转换到GBK编码后所需要的字符空间长度nRetLen = ::WideCharToMultiByte(CP_ACP, 0, lpUnicodeStr,-1, NULL, NULL, NULL, NULL);CHAR *lpGBKStr = new CHAR[nRetLen + 1];nRetLen = ::WideCharToMultiByte(CP_ACP, 0, lpUnicodeStr,-1, (char *)lpGBKStr, nRetLen, NULL, NULL);//转换到GBK编码if(!nRetLen){delete []lpUnicodeStr;delete []lpGBKStr;return -2;}str = lpGBKStr;delete []lpUnicodeStr;delete []lpGBKStr;return 0;}再来看Linux,它已经提供了函数可以实现这一功能,不仅如此,Linux还可以实现批量文件的字符编码转换呢。

mfc默认编码格式 -回复

mfc默认编码格式 -回复

mfc默认编码格式-回复MFC(Microsoft Foundation Classes)是一种用于开发Windows应用程序的C++类库。

在MFC中,默认编码格式是基于Unicode字符集的。

这个默认编码格式的设定是有一定历史原因的,与Windows操作系统的发展和国际化需求密切相关。

在本文中,我们将一步一步回答关于MFC 默认编码格式的问题,并探讨为何要采用Unicode作为默认编码格式以及如何在MFC中进行编码转换。

首先,我们需要了解什么是编码格式。

编码格式是一种将字符映射到数字代码的规则。

在计算机中,所有的字符都可以用数字表示。

不同的编码格式采用不同的字符映射规则,将字符和数字代码进行关联。

在早期的计算机系统中,使用的是ASCII编码格式,它只能表示英文字符和一些常见的符号。

然而,随着计算机的普及和国际化的需求增长,ASCII编码的字符范围已经无法满足需求了。

为解决字符编码的限制,主要出现了两种解决方案:多字节编码和Unicode编码。

多字节编码通过使用多个字节来表示一个字符,可以表示更多的字符,但是在不同的编码方式之间进行转换时可能会出现乱码的问题。

而Unicode编码采用固定的两个字节来表示一个字符,可以表示几乎所有国家和地区的字符,解决了多字节编码的转换问题。

在原始的MFC类库中,默认采用的是基于ANSI编码(也称作MBCS,多字节字符集)的编码格式。

这是因为在早期的Windows版本中,多字节编码是主要的字符编码方式。

然而,随着Windows的发展和全球化的需求,Unicode编码逐渐成为主流。

为了适应这一变化,微软于1995年引入了一个新的MFC类库版本(MFC 4.2),默认采用的编码格式是Unicode字符集。

Unicode编码格式在MFC中被称为UNICODE编码。

它与ANSI编码之间的转换并不简单,因为它们采用了不同的字符编码规则。

为了进行编码转换,MFC提供了一些用于转换的函数,如MultiByteToWideChar和WideCharToMultiByte。

各种字符编码间的转换方法:MultiByteToWideChar和MultiByteToWideChar

各种字符编码间的转换方法:MultiByteToWideChar和MultiByteToWideChar

MultiByteToWideChar和MultiByteToWideChar对各种字符编码间的转换函数原型:int WideCharToMultiByte(UINT CodePage,DWORD dwFlags,LPCWSTR lpWideCharStr,int cchWideChar,LPSTR lpMultiByteStr,int cbMultiByte,LPCSTR lpDefaultChar,LPBOOL lpUsedDefaultChar);此函数把宽字符串转换成指定的新的字符串,如ANSI,UTF8等,新字符串不必是多字节字符集。

参数:CodePage:指定要转换成的字符集代码页,它可以是任何已经安装的或系统自带的字符集,你也可以使用如下所示代码页之一。

参数说明:1、CodePage——指定要转换成的字符集代码页,它可以是任何已经安装的或系统自带的字符集,可选择以下代码页:CP_ACP //当前系统ANSI代码页CP_MACCP //当前系统Macintosh代码页CP_OEMCP //当前系统OEM代码页,一种原始设备制造商硬件扫描码CP_SYMBOL //Symbol代码页,用于Windows 2000及以后版本CP_THREAD_ACP //当前线程ANSI代码页,用于Windows 2000及以后版本CP_UTF7 //UTF-7,设置此值时lpDefaultChar和lpUsedDefaultChar都必须为NULLCP_UTF8 //UTF-8,设置此值时lpDefaultChar和lpUsedDefaultChar都必须为NULL用GetLocaleInfo 函数获取当前系统的代码页,936: 简体中文, 950: 繁体中文,949:韩文2、dwFlags——一般用0 就可以了指定是否转换成预制字符或合成的宽字符,对控制字符是否使用像形文字,以及怎样处理无效字符:MB_PRECOMPOSED //总是使用预制字符,即有单个预制字符时,就不会使用分解的基字符和不占空间字符。

Unicode,UTF8,GB2312,UCS2,GBK

Unicode,UTF8,GB2312,UCS2,GBK
{
unsigned short unicode;
unsigned char bytes[4] = {0};
int nbytes = 0;
int i = 0, j = 0;
int len=0;
if((ucs2 != NULL) && (utf8 != NULL))
LPCTSTR UnicodeToUTF8Char(LPTSTR pOut,WCHAR wcText)
{
// 注意 WCHAR高低字的顺序,低字节在前,高字节在后
LPTSTR pchar = (LPTSTR)&wcText;
pOut[0] = (0xE0 | ((pchar[1] & 0xF0) >> 4));
bytes[0] = ((unicode << 2) & 0x1f00 | 0xc000) >> 8;
}
else
{
nbytes = 3;
bytes[2] = (unicode & 0x3f) | 0x80;
{
LPCTSTR lpReturn,pGB2312Cursor,pGB2312InputEnd;
WCHAR wcBuffer;
lpReturn = (LPCTSTR)pWebGB2312Out;
pGB2312Cursor = (LPTSTR)pGB2312Input;
pGB2312InputEnd= pGB2312Cursor + GB2312Len;
//////////////////////////////////////////////////////////////////////////////

常见的三种中文内码转换代码

常见的三种中文内码转换代码

常见的三种中文内码转换代码常见的中文内码一般有GB2312(简体中文),GBK和台湾那边用的BIG5(繁体中文),有时候看一些台湾编程论坛里的资料,都是乱码,如果在IE中浏览,则要求安装繁体字库的支持。

网上也有很多中文内码的转换工具,什么专家,大师,巨匠之类所有光辉灿烂的名字都被使用了,但是在自己的程序中集成这些功能岂不是更好。

以前曾广泛流传过使用码表来转换中文内码的Code,但毕竟不完美,而且还要携带或内置一个巨大的表,浪费资源。

Windows中提供了MultiByteToWideChar和WideCharToMultiByte两兄弟函数,足可以搞定这些功能了。

在我以前写的一个小工具InfoCode里曾用到过类似代码。

以下代码经过收集整理调试编译测试以下四个函数分别实现:大五码转GBK码/GBK转大五码GB2312码转GBK码/GBK码转GB2312码于是有人要问了,为什么没有GB2312转BIG5和BIG5转GB2312呢,我们有GBK,可以做一下中转啊。

可以将GB2312转成GBK,再将GBK转成BIG5,反之亦然。

//---------------------------------------------------------------------------// 大五码转GBK码:// い地チ㎝瓣 --> 中華人民共和國void __fastcall BIG52GBK(char *szBuf){if(!strcmp(szBuf, ""))return;int nStrLen = strlen(szBuf);wchar_t *pws = new wchar_t[nStrLen + 1];try{int nReturn = MultiByteToWideChar(950, 0, szBuf, nStrLen, p ws, nStrLen + 1);BOOL bValue = false;nReturn = WideCharToMultiByte(936, 0, pws, nReturn, szBuf, nStrLen + 1, "?", &bValue);szBuf[nReturn] = 0;}__finally{delete[] pws;}}//---------------------------------------------------------------------------// GBK转大五码// 中華人民共和國 --> い地チ㎝瓣void __fastcall GBK2BIG5(char *szBuf){if(!strcmp(szBuf, ""))return ;int nStrLen = strlen(szBuf);wchar_t *pws = new wchar_t[nStrLen + 1];try{MultiByteToWideChar(936, 0, szBuf, nStrLen, pws, nStrLen + 1);BOOL bValue = false;WideCharT oMultiByte(950, 0, pws, nStrLen, szBuf, nStrLen + 1, "?", &bValue);szBuf[nStrLen] = 0;}__finally{delete[] pws;}}//----------------------------------------------------------------------------// 抱歉,这个提示又来了,为了防止不负责任的转载者,只好在此留些信息。

VB.net中文处理问题(Unicode和Ascii的编码问题)

VB.net中文处理问题(Unicode和Ascii的编码问题)

中文处理问题(Unicode和Ascii的编码问题)前段时间电脑显示中文不正常,就是因为把“控制面板”里的“语言地区设置”高级选项中设置为把非Unicode字符当English Unite State 地区来处理,不是China (PRC). 因为要做测试的程序不支持中文,改了上面说到的语言选项之后就出问题了。

结果别人发来的QQ信息都看不到,全部显示乱码。

跟踪调试了好几次,终于把这个问题解决了。

首先修改的是StringtoHex 和HexToString 两个函数,可以看出这两个函数明显不支持中文。

它在里面使用Len()Asc() Hex()等函数来作String变量到二进制字符串的转换。

由于中文汉字有两个字节大小,而Len()都是但作一个长度来处理,在加上Asc()处理中文字符,都是返回负数。

所以重写了这两个函数改成对字符串字节作处理,直接处理Byte到二进制表示法字符串的变换,很方便。

使用dim strtemp as stringdim a() as bytea=System.Text.Encoding.Unicode.GetBytes(strTemp.tochar)便可以获取字符串保存的数据byte信息了。

但是关键的地方还不是上面的那个函数,而是一个加解密的函数。

经过跟踪发现,这个函数加密后返回的字符串字节长度增加了。

可以看到是先用len()来计算字符串长度,再调用微软的加密解密函数库来加密,然后用一个Left()函数来截取加密后的字符串返回。

就是控制面板里的语言选项设置导致把加密函数库返回的字符串字节当作Unicode来处理,所以最后采用Left()截取的字符串和传进去的字符串字节长度不一样,这就是问题的根源。

由于中全部字符串都是当作Unicode来处理。

当把Ascii字母传给微软加密库之后,得到的却是自动转换而来的Unicode字符。

我曾想过字节编写函数把这个unicode 的两个字节分离成两个AscIi字符。

WideCharToMultiChar()_MultiCharToWideChar()编码转换疑问? - 调试易

WideCharToMultiChar()_MultiCharToWideChar()编码转换疑问? - 调试易

Windows平台下默认的Unicode编码是UTF-16,所以上面的两个函数都是基于UFT-16的。

MultiByteToWideChar()---------------------Maps a character string to a wide character (Unicode UTF-16) string. The character string mapped by this function is not necessarily from a multibyte character set. Note 8 (code page 65001) or UTF-16, instead of a specific code page, unless legacy standards or data formats prevent the use of Unicode. If use o 这个函数倒是明确说了是把一个ANSI转换为UTF-16编码。

反向转换函数就没有细说了。

WideCharToMultiByte()---------------------Maps a wide character string to a new character string. The new character string is not necessarily from a mult 8 (code page 65001) or UTF-16, instead of a specific code page, unless legacy standards or data formats prevent the use of Unicode. If use o尤其在xml文档的声明部分又可以指定tagging标明使用的encoding = utf-8/utf-16/gb2312等编码。

可是保存的时候又可以存储为UTF-8/UTF-16/ANSI等。

多字节字符串与宽字符串的转换

多字节字符串与宽字符串的转换

多字节字符串与宽字符串的转换可使用C API者Win32 API.C API: mbstowcs,wcstombsWin32 API: MultiByteToWideChar, WideCharToMultiByte下面着重介绍Win32 API的用法,C API的用法较为简单可参照Win32 API。

首先是WideCharToMultiByte通常你需要配置4个参数(其他参数如是使用即可),红色标记的部分。

依次是源宽字符串,需要转换的长度(-1,则为转换整个字符串),目标多字节字符串,目标缓冲区长度。

返回值表示转换为目标多字节字符串实际需要的长度(包括结束符)。

所以通常需要调用WideCharToMultiByte两次:第一次产生目标缓冲区长度,第二次产生目标字符串,像下面这样wchar_t* wcs = L"中国,你好!I Love You!";int lengthOfMbs = WideCharToMultiByte( CP_ACP, 0, wcs, -1, NULL, 0, NULL, NULL);char* mbs = new char[ lengthOfMbs ];WideCharToMultiByte( CP_ACP, 0, wcs, -1, mbs, lengthOfMbs, NULL, NULL);delete mbs;mbs = NULL;MultiByteToWideChar的用法类似char* mbs = "中国,你好!I Love You!";int lengthOfWcs = MultiByteToWideChar( CP_ACP, 0, mbs, -1, NULL, 0 );wchar_t* wcs = new wchar_t[ lengthOfWcs ];MultiByteToWideChar( CP_ACP, 0, mbs, -1, wcs, lengthOfWcs );delete wcs;wcs = NULL;下面两个函数封装了转换过程#include <Windows.h>#include <string>std::string WcsToMbs( const std::wstring& wcs ) {int lengthOfMbs = WideCharToMultiByte( CP_ACP, 0, wcs.c_str(), -1, NULL, 0, NULL, NULL);char* mbs = new char[ lengthOfMbs ];WideCharToMultiByte( CP_ACP, 0, wcs.c_str(), -1, mbs, lengthOfMbs, NULL, NULL);std::string result = mbs;delete mbs;mbs = NULL;return result;}std::wstring MbsToWcs( const std::string& mbs ) {int lengthOfWcs = MultiByteToWideChar( CP_ACP, 0, mbs.c_str(), -1, NULL, 0 );wchar_t* wcs = new wchar_t[ lengthOfWcs ];MultiByteToWideChar( CP_ACP, 0, mbs.c_str(), -1, wcs, lengthOfWcs );std::wstring result = wcs;delete wcs;wcs = NULL;return result;}不管什么时候,只要COM方法返回一个串,这个串都是Unicode串(这里指的是写入COM 规范的所有方法)。

MultiByteToWideChar和WideCharToMultiByte用法详解

MultiByteToWideChar和WideCharToMultiByte用法详解

MultiByteToWideChar和WideCharToMultiByte用法详解注意:这两个函数是由Windows提供的转换函数,不具有通用性C语言提供的转换函数为mbstowcs()/wcstombs()一、函数简单介绍涉及到的头文件:函数所在头文件:windows.h#include <windows.h>wchar_t类型所需头文件:wchar.h#include <wchar.h>( 1 ) MultiByteToWideChar()函数功能:该函数映射一个字符串到一个宽字符(unicode)的字符串。

由该函数映射的字符串没必要是多字节字符组。

函数原型:int MultiByteToWideChar(UINT CodePage,DWORD dwFlags,LPCSTR lpMultiByteStr,int cchMultiByte,LPWSTR lpWideCharStr,int cchWideChar);参数:1> CodePage:指定执行转换的多字节字符所使用的字符集这个参数可以为系统已安装或有效的任何字符集所给定的值。

你也可以指定其为下面的任意一值:2> dwFlags:一组位标记,用以指出是否未转换成预作或宽字符(若组合形式存在),是否使用象形文字替代控制字符,以及如何处理无效字符。

你可以指定下面是标记常量的组合,含义如下:MB_PRECOMPOSED:通常使用预作字符——就是说,由一个基本字符和一个非空字符组成的字符只有一个单一的字符值。

这是缺省的转换选择。

不能与MB_COMPOSITE值一起使用。

MB_COMPOSITE:通常使用组合字符——就是说,由一个基本字符和一个非空字符组成的字符分别有不同的字符值。

不能与MB_PRECOMPOSED值一起使用。

MB_ERR_INVALID_CHARS:如果函数遇到无效的输入字符,它将运行失败,且GetLastErro返回ERROR_NO_UNICODE_TRANSLATION 值。

unicode与ansi转换规则

unicode与ansi转换规则

unicode与ansi转换规则Unicode和ANSI都是字符编码标准,但是它们之间存在转换规则,因为两种编码方式之间并不兼容。

在进行字符转换时,需要一定的方法来确保成功转换。

本文将阐述Unicode和ANSI之间的转换规则,并详细描述如何完成转换。

一、Unicode和ANSI的概述Unicode是一种字符编码标准,可以用来表示世界上大多数语言的字符。

它的编码范围广泛,包括从基本的拉丁字母到中文和阿拉伯字符。

Unicode使用16位和32位编码方案,其中16位编码支持计算机基础设施的交换,32位编码则支持更高级别的语言如藏文和古文物。

ANSI(American National Standards Institute)是一种表示字符的方式,是一种针对西方语言所设计的字符编码标准。

ANSI编码支持虚拟码、ASCII码和扩展ASCII码。

二、Unicode向ANSI转换的方法以下列出三种常见的Unicode向ANSI转换的方法。

1、直接截取转换Unicode和ANSI编码之间存在一种直接截取的转换方法。

但需要注意的是,这种方法只适用于转换基本ASCII字符,不适用于转换包含特殊字符或扩展字符集的Unicode字符串。

例如,将Unicode字符串“Hello World”转换为ANSI格式。

在此示例中,ASCII字符集不包括特殊字符或扩展字符集,因此,直接使用左到右转换将字符截取即可。

Unicode字符串:H e l l o W o r l dANSI字符串:H e l l o W o r l d2、使用API转换许多编程语言提供了API(应用程序接口)来支持Unicode和ANSI之间的相互转换。

在这种情况下,可以使用API转换在Unicode和ANSI之间进行转换,而不必考虑具体字符集的范围。

在C ++中,可以使用WideCharToMultiByte API将Unicode字符串转换为ANSI字符串。

编码转换的方法(UNICODEASCIIUTF

编码转换的方法(UNICODEASCIIUTF

编码转换的方法(UNICODEASCIIUTF参考了网上一些方法:所谓的短字符,就是用8bit来表示的字符,典型的应用是ASCII码. 而宽字符,顾名思义,就是用16bit表示的字符,典型的有UNICODE.常用的代码页有CP_ACP和CP_UTF8两个。

使用CP_ACP代码页就实现了ANSI与Unicode之间的转换。

使用CP_UTF8代码页就实现了UTF-8与Unicode之间的转换。

1. ASCII to Unicode(CP_ACP)wstring ASCIIToUNICODE(char cArry[]) //传入参数为ANSI串,即用char数组或者string表示的串{int nLen = ::MultiByteToWideChar(CP_ACP, 0, cArry, -1, NULL, NULL); //将MultiByteToWideChar()的第四个形参设为-1,即可返回长度wchar_t *pTemp = new wchar_t[nLen]; //new一个wchar_t 空间,保存Unicode串memset(pTemp, 0, nLen*sizeof(wchar_t));::MultiByteToWideChar(CP_ACP, 0, cArry, -1, (LPWSTR)pTemp, nLen);wstring str = pTemp;if (pTemp){delete [] pTemp;pTemp = NULL;}return str;}2. Unicode to ASCII(CP_ACP)string UNICODET oASCII(wchar_t cArry[]) //传入参数为Unicode串,用“wchar_t cArry[] = {L"这是个测试"};”表示{int nLen = ::WideCharToMultiByte(CP_ACP, 0, cArry, -1, NULL, 0, NULL, NULL);char *pTemp = new char[nLen]; //new 一个char数组,保存ANSI串memset(pTemp, 0, nLen);::WideCharToMultiByte(CP_ACP, 0, cArry, -1, pTemp, nLen, NULL, NULL);string str = pTemp;if (pTemp){delete [] pTemp;pTemp = NULL;}return str;}3. UTF-8 to Unicode(CP_UTF8)wstring UTF8T oUnicode( const string& str ){int unicodeLen = ::MultiByteToWideChar(CP_UTF8, 0, str.c_ str(), -1, NULL, 0 );wchar_t *pUnicode = new wchar_t[unicodeLen];memset(pUnicode, 0, unicodeLen*sizeof(wchar_t));::MultiByteToWideChar( CP_UTF8, 0, str.c_str(), -1, (LPWSTR)pUnicode, unicodeLen );wstring rt = pUnicode;if(pUnicode ){delete [] pUnicode ;pUnicode = NULL;}return rt;}4. Unicode to UTF-8(CP_UTF8)string UnicodeToUTF8( const wstring& str ){// wide char to multi charint iTextLen = ::WideCharT oMultiByte(CP_UTF8, 0, str.c_str(), -1, NULL, 0, NULL, NULL );char *pElementText= new char[iTextLen];memset(pElementText, 0, iTextLen);::WideCharToMultiByte( CP_UTF8, 0, str.c_str(), -1, pElementT ext, iTextLen, NULL, NULL );string strText;strText = pElementText;if(pElementText){delete [] pElementText;pElementText = NULL;}return strText;}。

多字节与宽字节stringwstring互转

多字节与宽字节stringwstring互转

多字节与宽字节stringwstring互转多字节字符集(MBCS,Multi-Byte Chactacter Set):指⽤多个字节来表⽰⼀个字符的字符编码集合。

⼀般英⽂字母⽤1Byte,汉语等⽤2Byte来表⽰。

兼容ASCII 127。

在最初的时候,Internet上只有⼀种字符集——ANSI的ASCII字符集,它使⽤7 bits来表⽰⼀个字符,总共表⽰128个字符,其中包括了英⽂字母、数字、标点符号等常⽤字符。

为了扩充,以⽤于显⽰本国的语⾔,不同的国家和地区制定了不同的标准,由此产⽣了 GB2312, BIG5, JIS 等各⾃的编码标准。

这些使⽤ 2个来代表⼀个字符的各种汉字延伸编码⽅式,称为 ANSI 编码,⼜称为"MBCS(Muilti-Bytes Charecter Set,多字节字符集)"。

不同 ANSI 编码之间互不兼容,当信息在国际间交流时,⽆法将属于两种语⾔的⽂字,存储在同⼀段 ANSI 编码的⽂本中。

⼀个很⼤的缺点是,同⼀个编码值,在不同的编码体系⾥代表着不同的字。

这样就容易造成混乱。

导致了unicode码的诞⽣。

宽字节字符集:⼀般指Unicode编码的字符集,Unicode称为统⼀码或万国码,统⼀了不同国家的字符编码。

Unicode通常⽤两个字节表⽰⼀个字符,原有的英⽂编码从单字节变成双字节,只需要把⾼字节全部填为0就可以。

为了统⼀所有⽂字的编码,Unicode应运⽽⽣。

Unicode把所有语⾔都统⼀到⼀套编码⾥,这样就不会再有乱码问题了。

Unicode固然统⼀了编码⽅式,但是它的效率不⾼,⽐如UCS-4(Unicode的标准之⼀)规定⽤4个字节存储⼀个符号,那么每个英⽂字母前都必然有三个字节是0,这对存储和传输来说都很耗资源。

为了提⾼Unicode的编码效率,于是就出现了UTF-8编码。

UTF-8可以根据不同的符号⾃动选择编码的长短。

⽐如英⽂字母可以只⽤1个字节就够了。

PB中字符编码转换

PB中字符编码转换
lpWideCharStr:指向接收被转换字符串的缓冲区。
cchWideChar:指定由参数lpWideCharStr指向的缓冲区的字符个数。若此值为零,函数返回缓冲区所必需的宽字符数,在这种情况下,lpWideCharStr中的缓冲区不被使用。
返回值:
如果函数运行成功,并且cchWideChar不为零,返回值是由lpWideCharStr指向的缓冲区中写入的宽字符数;
lpDefaultChar和lpUsedDefaultChar都设为NULL,函数会更快一些。
返回值:
如果函数成功,且cbMultiByte非0,返回写入lpMultiByteStr的字节数(包括字符串结尾的null);cbMultiByte为0,则返回转换所需 字节数。函数失败,返回0。
FUNCTION long MultiByteToWideChar(uint CodePage, ulong dwFlags, ref blob lpMultiByteStr,long cchMultiByte,ref blob lpWideCharStr, long cchWideChar) LIBRARY "kernel32.dll"
dwFlags: 指定是否转换成预制字符或合成的宽字符,对控制字符是否使用像形文字,以及怎样处理无效字符。
lpMultiByteStr:指向将被转换字符串的字符。
cchMultiByte:指定由参数lpMultiByteStr指向的字符串中字节的个数。如果lpMultiByteStr指定的字符串以空字符终止,可以设置为-1(如果字符串不是以空字符中止,设置为-1可能失败,可能成功),此参数设置为0函数将失败。
cchWideChar: 待转换宽字符串的长度,-1表示转换到字符串结尾。

multibytetowidechar函数

multibytetowidechar函数

multibytetowidechar函数multibytetowidechar函数是一个Windows API函数,它的作用是将一个多字节字符串转换为一个宽字节字符串。

在Windows平台上,Unicode编码是主流,然而在某些情况下,我们需要处理多种不同的字符编码,这时候就需要使用multibytetowidechar函数进行转换。

在使用multibytetowidechar函数之前,我们需要了解一些相关的术语和知识点。

多字节字符串(MB)是指使用单字节字符集编码(如ASCII)或多字节字符集编码(如GB2312、GBK、BIG5)来表示的字符串。

而宽字节字符串(W)则是指使用双字节字符集编码(如Unicode的UTF-16或UTF-32)来表示的字符串。

multibytetowidechar函数的原型如下:```C++int multibytetowidechar(UINT CodePage,DWORD dwFlags,LPCSTR lpMultiByteStr,int cbMultiByte,LPWSTR lpWideCharStr,int cchWideChar);```multibytetowidechar函数的参数解释如下:- CodePage:指定了多字节字符串使用的字符编码,常用的字符编码包括CP_UTF8、CP_ACP、CP_GBK等。

- dwFlags:可以设置一些标志位来影响函数的转换行为,例如可以使用MB_COMPOSITE标志来表示多字节字符串中包含复合字符。

- lpMultiByteStr:指向要转换的多字节字符串。

- cbMultiByte:指定了要转换的多字节字符串的长度(以字节为单位),如果设置为-1,则将转换整个字符串,直到遇到NULL为止。

- lpWideCharStr:将被填充为转换后的宽字节字符串。

- cchWideChar:指定了lpWideCharStr缓冲区的大小(以字符为单位),如果此值小于转换后的宽字节字符串所需的大小,则返回值为0,并且lpWideCharStr缓冲区不得赋值。

c++字符集之间转换(UTF-8,UNICODE,Gb2312)

c++字符集之间转换(UTF-8,UNICODE,Gb2312)
tmp = rst[j+2] = buf[2];
j += 3;
i += 2;
}
}
rst[j] = ’’;
//返回结果
pOut = rst;
delete[]rst;
return;
}
voidCChineseCode::UTF_8ToGB2312(string &pOut, char*pText, intpLen){
return;
}
voidCChineseCode::UnicodeToGB2312(char* pOut,wchar_tuData){
WideCharToMultiByte(CP_ACP,NULULL,NULL);
return;
}
voidCChineseCode::Gb2312ToUnicode(wchar_t* pOut,char*gbBuffer){
}else{
wchar_tpbuffer;
Gb2312ToUnicode(&pbuffer,pText+i);
UnicodeToUTF_8(buf,&pbuffer);
unsigned shortinttmp = 0;
tmp = rst[j] = buf[0];
tmp = rst[j+1] = buf[1];
};
//类实现
voidCChineseCode::UTF_8ToUnicode(wchar_t* pOut,char*pText){
char* uchar = (char*)pOut;
uchar[1] = ((pText[0] & 0x0F) << 4) + ((pText[1] >> 2) & 0x0F);

multibytetowidechar的用法

multibytetowidechar的用法

multibytetowidechar的用法[multibytetowidechar的用法]multibytetowidechar函数是Windows API中的一个功能强大的字符转换函数,常用于将多字节字符转换为宽字符。

本文将详细介绍multibytetowidechar函数的用法,并逐步回答您的问题。

1. multibytetowidechar函数的功能multibytetowidechar函数用于将多字节字符转换为宽字符。

宽字符是指Unicode字符集中每个字符占用两个字节的字符编码方式。

通过这个函数,我们可以实现多字节字符与Unicode字符之间的转换。

2. multibytetowidechar函数的原型下面是multibytetowidechar函数的原型:int multibytetowidechar(UINT CodePage, 源多字节字符集的代码页DWORD dwFlags, 字符转换标志LPCSTR lpMultiByteStr, 源多字节字符int cbMultiByte, 源多字节字符的字节数LPWSTR lpWideCharStr, 目标宽字符缓冲区int cchWideChar 目标宽字符缓冲区的大小);3. multibytetowidechar函数的参数解析- CodePage:表示源多字节字符集的代码页。

常见的CodePage有CP_UTF8、CP_ACP等。

CP_UTF8用于表示采用UTF-8编码的多字节字符集,CP_ACP用于表示系统的默认多字节字符集。

- dwFlags:表示字符转换的标志。

常用的标志有0和MB_PRECOMPOSED。

0表示使用默认转换方法,MB_PRECOMPOSED表示以合成字符形式转换。

- lpMultiByteStr:指向源多字节字符的指针。

- cbMultiByte:表示源多字节字符的字节数。

- lpWideCharStr:指向目标宽字符缓冲区的指针。

C++字符串编码转换

C++字符串编码转换

C++字符串编码转换C++中字符串有很多种类,详情参考。

本⽂主要以string类型为例,讲⼀下字符串的编码,选择string主要是因为:byte是字符串⼆进制编码的最⼩结构,字符串本质上就是⼀个byte数组C++没有byte类型,第三⽅的byte类型通常是char实现的char可以直接转换成string,也就是说byte直接转string代码转⾃,其它编码格式的转换⽅法类似(先转双字节Unicode编码,再通过转换为其它编码的多字节),代码如下:std::string UTF8_To_string(const std::string& str){int nwLen = MultiByteToWideChar(CP_UTF8, 0, str.c_str(), -1, NULL, 0);wchar_t* pwBuf = new wchar_t[nwLen + 1];//加1⽤于截断字符串memset(pwBuf, 0, nwLen * 2 + 2);MultiByteToWideChar(CP_UTF8, 0, str.c_str(), str.length(), pwBuf, nwLen);int nLen = WideCharToMultiByte(CP_ACP, 0, pwBuf, -1, NULL, NULL, NULL, NULL);char* pBuf = new char[nLen + 1];memset(pBuf, 0, nLen + 1);WideCharToMultiByte(CP_ACP, 0, pwBuf, nwLen, pBuf, nLen, NULL, NULL);std::string retStr = pBuf;delete[]pBuf;delete[]pwBuf;pBuf = NULL;pwBuf = NULL;return retStr;}std::string string_To_UTF8(const std::string& str){int nwLen = ::MultiByteToWideChar(CP_ACP, 0, str.c_str(), -1, NULL, 0);wchar_t* pwBuf = new wchar_t[nwLen + 1];//加1⽤于截断字符串ZeroMemory(pwBuf, nwLen * 2 + 2);::MultiByteToWideChar(CP_ACP, 0, str.c_str(), str.length(), pwBuf, nwLen);int nLen = ::WideCharToMultiByte(CP_UTF8, 0, pwBuf, -1, NULL, NULL, NULL, NULL);char* pBuf = new char[nLen + 1];ZeroMemory(pBuf, nLen + 1);::WideCharToMultiByte(CP_UTF8, 0, pwBuf, nwLen, pBuf, nLen, NULL, NULL);std::string retStr(pBuf);delete[]pwBuf;delete[]pBuf;pwBuf = NULL;pBuf = NULL;return retStr;}注:string使⽤的ANSI编码,在简体中⽂系统下ANSI编码代表GB2312编码。

c语言码制传化 -回复

c语言码制传化 -回复

c语言码制传化-回复C语言码制传化是指将不同的字符编码方式之间进行转化的过程。

在计算机科学领域中,由于不同国家和地区使用不同的字符编码方式,使得不同的编码之间存在着互相转化的需要。

本文将以C语言码制传化为主题,分步回答有关该过程的相关问题。

第一步:了解字符编码在开始进行C语言码制传化之前,我们首先需要了解何为字符编码。

字符编码是一种将字符映射为计算机可识别的数字编码的方法。

在计算机系统中,字符被表示为一系列的二进制位,用以储存和传输字符。

然而,不同的国家和地区使用不同的字符集和编码方式,导致字符编码的多样性。

常见的字符编码方式包括ASCII码(美国信息交换标准代码)和Unicode 码(国际标准字符集)。

ASCII码是最早被广泛使用的字符编码方式,它使用7位二进制数字表示128个字符。

而Unicode码则是为了满足全球各个语言和符号的需求而设计的编码方式,它使用了16位二进制数字表示65536个字符。

第二步:字符编码转化方法在C语言中,可以使用多种方法进行字符编码的转化。

其中,最常用的方法是通过使用字符数组来实现各编码之间的转化。

对于ASCII码和Unicode码之间的转化,可以通过使用标准库函数如`mbstowcs`和`wcstombs`来实现。

`mbstowcs`函数将多字节字符转化为宽字符,而`wcstombs`函数则将宽字符转化为多字节字符。

在使用这些函数时,需要注意字符编码之间的差异,以便正确地进行转化。

示例代码如下:#include <stdio.h>#include <wchar.h>#include <locale.h>int main() {setlocale(LC_ALL, ""); 设置当前区域的字符编码char mbstr[] = "Hello, world!"; 多字节字符数组wchar_t wcstr[20]; 宽字符数组多字节字符转化为宽字符mbstowcs(wcstr, mbstr, sizeof(wcstr) / sizeof(wchar_t));wprintf(L"宽字符:ls\n", wcstr);wchar_t wcstr2[] = L"宽字符数组"; 宽字符数组char mbstr2[20]; 多字节字符数组宽字符转化为多字节字符wcstombs(mbstr2, wcstr2, sizeof(mbstr2));printf("多字节字符:s\n", mbstr2);return 0;}第三步:其他字符编码的转化方法除了ASCII码和Unicode码之间的转化,C语言还可以支持其他字符编码之间的转化。

字符编码之间的相互转换

字符编码之间的相互转换

字符编码之间的相互转换 UTF8与GBKC++ UTF8编码转换 CChineseCode 一预备知识1,字符:字符是抽象的最小文本单位。

它没有固定的形状(可能是一个字形),而且没有值。

“A”是一个字符,“€”(德国、法国和许多其他欧洲国家通用货币的标志)也是一个字符。

“中”“国”这是两个汉字字符。

字符仅仅代表一个符号,没有任何实际值的意义。

2,字符集:字符集是字符的集合。

例如,汉字字符是中国人最先发明的字符,在中文、日文、韩文和越南文的书写中使用。

这也说明了字符和字符集之间的关系,字符组成字符集(iso8859-1,GB2312/GBK,unicode)。

3,代码点:字符集中的每个字符都被分配到一个“代码点”。

每个代码点都有一个特定的唯一数值,称为标值。

该标量值通常用十六进制表示。

4,代码单元:在每种编码形式中,代码点被映射到一个或多个代码单元。

“代码单元”是各个编码方式中的单个单元。

代码单元的大小等效于特定编码方式的位数: UTF-8 :UTF-8 中的代码单元由 8 位组成;在 UTF-8 中,因为代码单元较小的缘故,每个代码点常常被映射到多个代码单元。

代码点将被映射到一个、两个、三个或四个代码单元; UTF-16 :UTF-16 中的代码单元由 16 位组成;UTF-16 的代码单元大小是 8 位代码单元的两倍。

所以,标量值小于 U+10000 的代码点被编码到单个代码单元中; UTF-32:UTF-32 中的代码单元由 32 位组成; UTF-32 中使用的 32 位代码单元足够大,每个代码点都可编码为单个代码单元; GB18030:GB18030 中的代码单元由 8 位组成;在 GB18030 中,因为代码单元较小的缘故,每个代码点常常被映射到多个代码单元。

代码点将被映射到一个、两个或四个代码单元。

5,举例:“中国北京香蕉是个大笨蛋”这是我定义的aka字符集;各字符对应代码点为:北 00000001 京 00000010 香 10000001 蕉 10000010 是 10000100 个 10001000 大 10 010000 笨 10100000 蛋 11000000 中 00000100 国 00001000下面是我定义的 zixia 编码方案(8位),可以看到它的编码中表示了aka字符集的所有字符对应的代码单元;北 10000001 京 10000010 香 00000001 蕉 00000010 是 00000100 个 00001000 大 00010000 笨 00100000 蛋 01000000 中 10000100 国 10001000所谓文本文件就是我们按一定编码方式将二进制数据表示为对应的文本如 00000001000000100000010000001000000100000010000001000000这样的文件。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

MultiByteToWideChar和MultiByteToWideChar对各种字符编码间的转换函数原型:int WideCharToMultiByte(UINT CodePage,DWORD dwFlags,LPCWSTR lpWideCharStr,int cchWideChar,LPSTR lpMultiByteStr,int cbMultiByte,LPCSTR lpDefaultChar,LPBOOL lpUsedDefaultChar);此函数把宽字符串转换成指定的新的字符串,如ANSI,UTF8等,新字符串不必是多字节字符集。

参数:CodePage:指定要转换成的字符集代码页,它可以是任何已经安装的或系统自带的字符集,你也可以使用如下所示代码页之一。

参数说明:1、CodePage——指定要转换成的字符集代码页,它可以是任何已经安装的或系统自带的字符集,可选择以下代码页:CP_ACP //当前系统ANSI代码页CP_MACCP //当前系统Macintosh代码页CP_OEMCP //当前系统OEM代码页,一种原始设备制造商硬件扫描码CP_SYMBOL //Symbol代码页,用于Windows 2000及以后版本CP_THREAD_ACP //当前线程ANSI代码页,用于Windows 2000及以后版本CP_UTF7 //UTF-7,设置此值时lpDefaultChar和lpUsedDefaultChar都必须为NULLCP_UTF8 //UTF-8,设置此值时lpDefaultChar和lpUsedDefaultChar都必须为NULL用GetLocaleInfo 函数获取当前系统的代码页,936: 简体中文, 950: 繁体中文,949:韩文2、dwFlags——一般用0 就可以了指定是否转换成预制字符或合成的宽字符,对控制字符是否使用像形文字,以及怎样处理无效字符:MB_PRECOMPOSED //总是使用预制字符,即有单个预制字符时,就不会使用分解的基字符和不占空间字符。

此为函数的默认选项,不能和MB_COMPOSITE合用MB_COMPOSITE //总是使用分解字符,即总是使用基字符+不占空间字符的方式MB_ERR_INVALID_CHARS //设置此选项,函数遇到非法字符就失败并返回错误码ERROR_NO_UNICODE_TRANSLATION,否则丢弃非法字符MB_USEGLYPHCHARS //使用像形字符代替控制字符3、lpMultiByteStr //要转换的字符串4、cbMultiByte //要转换字符串的长度,-1表示转换到字符串结尾。

返回原字符串长度。

0 作为结束符的字符串5、lpWideCharStr//接收转换后输出的宽字符串的缓冲,如果为NULL, 就是代表计算生成的字符串的长度。

6、cchWideChar//输出缓冲区大小,转化生成的unicode 字符串缓存的容量。

如果为0,lpMultiByteStr将被忽略,函数将返回所需缓冲区大小而不同为0表示调用失败;当cchWideChar为0时,函数将返回所需缓冲区大小int BufSize = MultiByteToWideChar(936,0,s,-1,NULL,0); //计算简体中文字符串s 转成widestring 之后占用的内存字节数…… //在此处为wsbuf 分配内存BufSize 个字节MultiByteToWideChar(936,0,s,-1,wsbuf,BufSize); //把简体中文字符串s 转化为unicode 的WideString最常用的应该是CP_ACP和CP_UTF8了,前者将宽字符转换为ANSI,后者转换为UTF8。

例一:Unicode转换到GBK#include <Windows.h>#define CODE_PAGE_GB18030 54936int Unicode2GBK( wchar_t *pUnicode, char** ppDest){ // get the size of the dest stringconst int size = ::WideCharToMultiByte( CODE_PAGE_GB18030, 0/* you can do more for it*/,pUnicode, -1, 0, 0, 0, 0 );if ( size == 0 ) { return -1; }char* pDestString = new char[size + 2];::memset( pDestString, 0, sizeof(pDestString) );// transformint ret = ::WideCharToMultiByte( CODE_PAGE_GB18030, 0, pUnicode, -1, pDestString, size, 0, 0 );if( ret == 0 ) { delete pDestString; return -1; }else { *ppDest = pDestString; return 0; } }例二:字串转换wchar_t* pwszUnicode = "Holle, word! 你好,中国!";int iSize;char* pszMultiByte;iSize = WideCharToMultiByte(CP_ACP, 0, pwszUnicode, -1, NULL, 0, NULL, NULL);pszMultiByte = (char*)malloc((iSize+1)/**sizeof(char)*/); WideCharToMultiByte(CP_ACP, 0, pwszUnicode, -1, pszMultiByte, iSize, NULL, NULL);注意事项:dwFlags:指定如何处理没有转换的字符,但不设此参数函数会运行的更快一些,我都是把它设为0。

可设的值如下表所示:WC_NO_BEST_FIT_CHARS 把不能直接转换成相应多字节字符的Unicode字符转换成lpDefaultChar指定的默认字符。

也就是说,如果把Unicode转换成多字节字符,然后再转换回来,你并不一定得到相同的Unicode字符,因为这期间可能使用了默认字符。

此选项可以单独使用,也可以和其他选项一起使用。

WC_COMPOSITECHECK 把合成字符转换成预制的字符。

它可以与后三个选项中的任何一个组合使用,如果没有与他们中的任何一个组合,则与选项WC_SEPCHARS相同。

WC_ERR_INVALID_CHARS 此选项会致使函数遇到无效字符时失败返回,并且GetLastError会返回错误码ERROR_NO_UNICODE_TRANSLATION。

否则函数会自动丢弃非法字符。

此选项只能用于UTF8。

WC_DISCARDNS 转换时丢弃不占空间的字符,与WC_COMPOSITECHECK一起使用WC_SEPCHARS 转换时产生单独的字符,此是默认转换选项,与WC_COMPOSITECHECK一起使用WC_DEFAULTCHAR 转换时使用默认字符代替例外的字符,(最常见的如’?’),与WC_COMPOSITECHECK一起使用。

当指定WC_COMPOSITECHECK时,函数会将合成字符转换成预制字符。

合成字符由一个基字符和一个不占空间的字符(如欧洲国家及汉语拼音的音标)组成,每一个都有不同的字符值。

预制字符有一个用于表示基字符和不占空间字符的合成体的单一的字符值。

当指定WC_COMPOSITECHECK选项时,也可以使用上表列出的最后3个选项来定制预制字符的转换规则。

这些选项决定了函数在遇到宽字符串的合成字符没有对应的预制字符时的行为,他们与WC_COMPOSITECHECK一起使用,如果都没有指定,函数默认WC_SEPCHARS。

对于下列代码页,dwFlags必须为0,否则函数返回错误码ERROR_INVALID_FLAGS。

50220 5022150222 50225 50227 50229 52936 54936 57002到5701165000(UTF7) 42(Symbol)对于UTF8,dwFlags必须为0或WC_ERR_INVALID_CHARS,否则函数都将失败返回并设置错误码ERROR_INVALID_FLAGS,你可以调用GetLastError获得。

lpUsedDefaultChar:开关变量的指针,用以表明是否使用过默认字符。

对于要求此参数为NULL的dwFlags而使用此参数,函数将失败返回并设置错误码ERROR_INVALID_PARAMETER。

lpDefaultChar和lpUsedDefaultChar都设为NULL,函数会更快一些。

第二个是多字节字符到宽字符转换函数,函数原型如下:> int MultiByteToWideChar(UINT CodePage,DWORD dwFlags,LPCSTR lpMultiByteStr,int cbMultiByte,LPWSTR lpWideCharStr,int cchWideChar);此函数把多字节字符串转换成宽字符串(Unicode),待转换的字符串并不一定是多字节的。

此函数的参数,返回值及注意事项参见上面函数WideCharToMultiByte的说明,这里只对dwFlags做简单解释。

dwFlags:指定是否转换成预制字符或合成的宽字符,对控制字符是否使用像形文字,以及怎样处理无效字符。

MB_PRECOMPOSED 总是使用预制字符,即有单个预制字符时,就不会使用分解的基字符和不占空间字符。

此为函数的默认选项,不能和MB_COMPOSITE合用MB_COMPOSITE 总是使用分解字符,即总是使用基字符+不占空间字符的方式MB_ERR_INVALID_CHARS 设置此选项,函数遇到非法字符就失败并返回错误码ERROR_NO_UNICODE_TRANSLATION,否则丢弃非法字符MB_USEGLYPHCHARS 使用像形字符代替控制字符对于下列代码页,dwFlags必须为0,否则函数返回错误码ERROR_INVALID_FLAGS。

50220 5022150222 50225 50227 50229 52936 54936 57002到5701165000(UTF7) 42(Symbol)对于UTF8,dwFlags必须为0或MB_ERR_INVALID_CHARS,否则函数都将失败并返回错误码ERROR_INVALID_FLAGS。

相关文档
最新文档