char wchar_t CString的相互转化

本文介绍了一个用于字符编码转换的实用程序,重点讲解了如何在多种字符集之间进行转换,包括从多字节到宽字符、从宽字符到多字节等操作。提供了具体的函数实现方法,并演示了如何通过实例来验证转换的正确性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <windows.h>
#include <tchar.h>
#include <locale.h>
#include <stdio.h>
#include <atlstr.h>

 

/**
 *  @param cbCharSize: lpCharStr的字节个数,可以设为-1,如果以null结束。
 *  @param cchWCharCnt: lpWCharStr的字符个数
 * 
 *  @return: 如果成功,返回写入lpWCharStr的字符个数;如果成功并且cchWiCharCnt==0,
 *  返回lpWideCharStr缓存区需要的字符个数。
 *  失败返回0。
 * 
 **/
DWORD CharToWChar_t( LPSTR lpCharStr, DWORD cbCharSize, LPWSTR lpWCharStr, DWORD cchWCharCnt)
{
 return MultiByteToWideChar( CP_ACP, 0, lpCharStr, cbCharSize, lpWCharStr, cchWCharCnt );
}

 

/**
 * @param cchWCharCnt:字符个数,可以设为-1,如果以null结束。
 * @param cbCharSize:lpCharStr串的字节大小。

 *  @return: 如果成功,返回写入lpCharStr的字符个数;如果成功并且cbCharSize==0,
 *  返回lpCharStr缓存区需要的字节个数。
 *  失败返回0。
 *
 **/
DWORD WChar_tToChar( LPWSTR lpWCharStr, DWORD cchWCharCnt, LPSTR lpCharStr, DWORD cbCharSize)
{
 return WideCharToMultiByte(CP_ACP, 0, lpWCharStr, cchWCharCnt, lpCharStr, cbCharSize, NULL, NULL);
}

 

/**
 *  @param cbCharSize: lpCharStr串的大小
 *  @return: 返回需要的字节个数,包括null结束符。
 **/
DWORD CStringToChar( CString cstrInput, LPSTR lpCharStr, DWORD cbCharSize)
{
#ifdef UNICODE
 //GetLength()返回wchar_t个数
 return WChar_tToChar( (LPWSTR)(LPCTSTR)cstrInput, cstrInput.GetLength(), lpCharStr, cbCharSize);
#else
 //GetLength()返回char个数
 if ( cbCharSize > cstrInput.GetLength() )
 {
  strcpy_s( lpCharStr, cbCharSize, (LPCSTR)(LPCTSTR)cstrInput );
 }
 return cstrInput.GetLength()+1;
#endif
}

 

/**
*  @param cchWCharCnt: lpCharStr串的字符wchar_t个数
*  @return: 返回需要的字符个数,包括null结束符。
 **/
DWORD CStringToWChar_t( CString cstrInput, LPWSTR lpWCharStr, DWORD cchWCharCnt)
{
#ifdef UNICODE
 if ( cchWCharCnt > cstrInput.GetLength() )
 {
  wcscpy_s( lpWCharStr, cchWCharCnt, (LPCWSTR)(LPCTSTR)cstrInput );
 }
 return cstrInput.GetLength()+1;
#else
 return CharToWChar_t( (LPSTR)(LPCTSTR)cstrInput, cstrInput.GetLength(), lpWCharStr, cchWCharCnt);
#endif
}

 

int _tmain( int argc, TCHAR * argv[] )
{
 setlocale(LC_ALL, "chs");

 char * text[100], *lpChar;
 wchar_t * lpWchar;
 int bytes;
 while ( scanf("%s", text))
 {
  CString tmp((LPSTR)text);  //里面使用wchar_T或是char
  printf("%d/n", tmp.GetLength());
       
  bytes = CStringToChar( tmp, NULL, 0);
  lpChar = new char[bytes+1];
  CStringToChar(tmp, lpChar, bytes);
  lpChar[bytes]=0;
  printf("%s/n", lpChar);
  delete [] lpChar;

  bytes = CStringToWChar_t(tmp, NULL, 0);
  lpWchar = new wchar_t[bytes+1];
  CStringToWChar_t(tmp, lpWchar, bytes);
  lpWchar[bytes]=0;
  printf("%S/n", lpWchar);
  delete [] lpWchar;
 }
 
 return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值