虽然不知道写的什么,但看起来很厉害的样子。

下面摘取了2篇。(封装的不一样。)

1

这个是原文链接

#include <windows.h>
static WCHAR *mbcsToUnicode(const char *zFilename)
{
int nByte; WCHAR *zMbcsFilename; int codepage = AreFileApisANSI() ? CP_ACP : CP_OEMCP; nByte = MultiByteToWideChar(codepage, 0, zFilename, -1, NULL,0)*sizeof(WCHAR); zMbcsFilename = (WCHAR*)malloc( nByte*sizeof(zMbcsFilename[0]) ); if( zMbcsFilename==0 ){ return 0; } nByte = MultiByteToWideChar(codepage, 0, zFilename, -1, zMbcsFilename, nByte); if( nByte==0 ){ free(zMbcsFilename); zMbcsFilename = 0; } return zMbcsFilename; } static char *unicodeToUtf8(const WCHAR *zWideFilename)
{
int nByte; char *zFilename; nByte = WideCharToMultiByte(CP_UTF8, 0, zWideFilename, -1, 0, 0, 0, 0); zFilename = (char*)malloc( nByte ); if( zFilename==0 ){ return 0; } nByte = WideCharToMultiByte(CP_UTF8, 0, zWideFilename, -1, zFilename, nByte, 0, 0); if( nByte == 0 ){ free(zFilename); zFilename = 0; } return zFilename; } static WCHAR *utf8ToUnicode(const char *zFilename) { int nChar; WCHAR *zWideFilename; nChar = MultiByteToWideChar(CP_UTF8, 0, zFilename, -1, NULL, 0); zWideFilename = (WCHAR*) malloc( nChar*sizeof(zWideFilename[0]) ); if( zWideFilename==0 ){ return 0; } nChar = MultiByteToWideChar(CP_UTF8, 0, zFilename, -1, zWideFilename, nChar); if( nChar==0 ){ free(zWideFilename); zWideFilename = 0; } return zWideFilename; } static char *unicodeToMbcs(const WCHAR *zWideFilename) { int nByte; char *zFilename; int codepage = AreFileApisANSI() ? CP_ACP : CP_OEMCP; nByte = WideCharToMultiByte(codepage, 0, zWideFilename, -1, 0, 0, 0, 0); zFilename = (char*)malloc( nByte ); if( zFilename==0 ){ return 0; } nByte = WideCharToMultiByte(codepage, 0, zWideFilename, -1, zFilename, nByte, 0, 0); if( nByte == 0 ){ free(zFilename); zFilename = 0; } return zFilename; } char *AnsiToUtf8( const char *zFilename) /** ansi 2 utf8 */ { char *zFilenameUtf8; WCHAR *zTmpWide; zTmpWide = mbcsToUnicode(zFilename); if( zTmpWide==0 ){ return 0; } zFilenameUtf8 = unicodeToUtf8(zTmpWide); free(zTmpWide); return zFilenameUtf8; } char *Utf8ToAnsi( char *zFilename) /*** utf8 - ansi */ { char *zFilenameMbcs; WCHAR *zTmpWide; zTmpWide = utf8ToUnicode(zFilename); if( zTmpWide==0 ){ return 0; } zFilenameMbcs = unicodeToMbcs(zTmpWide); free(zTmpWide); return zFilenameMbcs; }

2

这个是原文链接

//UTF-8转Unicode
std::wstring Utf82Unicode(const std::string& utf8string)
{
  int widesize = ::MultiByteToWideChar(CP_UTF8, 0, utf8string.c_str(), -1, NULL, 0);
  if (widesize == ERROR_NO_UNICODE_TRANSLATION)
  {
    throw std::exception("Invalid UTF-8 sequence.");
  }
  if (widesize == 0)
  {
    throw std::exception("Error in conversion.");
  }
  std::vector<wchar_t> resultstring(widesize);
  int convresult = ::MultiByteToWideChar(CP_UTF8, 0, utf8string.c_str(), -1, &resultstring[0], widesize);
  if (convresult != widesize)
  {
    throw std::exception("La falla!");
  }
  return std::wstring(&resultstring[0]);
}
//unicode 转为 ascii
string WideByte2Acsi(wstring& wstrcode)
{
  int asciisize = ::WideCharToMultiByte(CP_OEMCP, 0, wstrcode.c_str(), -1, NULL, 0, NULL, NULL);
  if (asciisize == ERROR_NO_UNICODE_TRANSLATION)
  {
    throw std::exception("Invalid UTF-8 sequence.");
  }
  if (asciisize == 0)
  {
    throw std::exception("Error in conversion.");
  }
  std::vector<char> resultstring(asciisize);
  int convresult =::WideCharToMultiByte(CP_OEMCP, 0, wstrcode.c_str(), -1, &resultstring[0], asciisize, NULL, NULL);
  if (convresult != asciisize)
  {
    throw std::exception("La falla!");
  }
  return std::string(&resultstring[0]);
}
//utf-8 转 ascii
string UTF_82ASCII(string& strUtf8Code)
{
  string strRet("");
  //先把 utf8 转为 unicode
  wstring wstr = Utf82Unicode(strUtf8Code);
  //最后把 unicode 转为 ascii
  strRet = WideByte2Acsi(wstr);
  return strRet;
}
///////////////////////////////////////////////////////////////////////
//ascii 转 Unicode
wstring Acsi2WideByte(string& strascii)
{
  int widesize = MultiByteToWideChar (CP_ACP, 0, (char*)strascii.c_str(), -1, NULL, 0);
  if (widesize == ERROR_NO_UNICODE_TRANSLATION)
  {
    throw std::exception("Invalid UTF-8 sequence.");
  }
  if (widesize == 0)
  {
    throw std::exception("Error in conversion.");
  }
  std::vector<wchar_t> resultstring(widesize);
  int convresult = MultiByteToWideChar (CP_ACP, 0, (char*)strascii.c_str(), -1, &resultstring[0], widesize);
  if (convresult != widesize)
  {
    throw std::exception("La falla!");
  }
  return std::wstring(&resultstring[0]);
}
//Unicode 转 Utf8
std::string Unicode2Utf8(const std::wstring& widestring)
{
  int utf8size = ::WideCharToMultiByte(CP_UTF8, 0, widestring.c_str(), -1, NULL, 0, NULL, NULL);
  if (utf8size == 0)
  {
    throw std::exception("Error in conversion.");
  }
  std::vector<char> resultstring(utf8size);
  int convresult = ::WideCharToMultiByte(CP_UTF8, 0, widestring.c_str(), -1, &resultstring[0], utf8size, NULL, NULL);
  if (convresult != utf8size)
  {
    throw std::exception("La falla!");
  }
  return std::string(&resultstring[0]);
}
//ascii 转 Utf8
string ASCII2UTF_8(string& strAsciiCode)
{
  string strRet("");
  //先把 ascii 转为 unicode
  wstring wstr = Acsi2WideByte(strAsciiCode);
  //最后把 unicode 转为 utf8
  strRet = Unicode2Utf8(wstr);
  return strRet;
}