日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

iconv 转换字符编码,兼容VC转换

發布時間:2023/12/20 c/c++ 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 iconv 转换字符编码,兼容VC转换 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
#ifndef __CHAR_CONVERT_H__ #define __CHAR_CONVERT_H__#ifdef OS_WINDOWS#include <SDKDDKVer.h> //"targetver.h"#ifndef WIN32_LEAN_AND_MEAN #define WIN32_LEAN_AND_MEAN // 從 Windows 頭文件中排除極少使用的信息 #endif// Windows 頭文件: #include <windows.h>#else // Linux #include "iconv.h"#ifndef ICONV_BUFFER_SIZE #define ICONV_BUFFER_SIZE 1024 #endif#define WCHAR wchar_t #ifdef _UNICODE #define TCHAR wchar_t #else #define TCHAR char #endif#endif / #define E_CHAR CWCharToChar::EChar #define E_WCHAR CWCharToChar::EWChar #define E_UTF8 CWCharToChar::EUtf8#define NULL_STR CWCharToChar::GetNullStr()static char g_NULL[2] = {0};/ // 簡單的wchar_t 和 char 轉換類, 且包含與UTF8的轉換 class CWCharToChar { public:enum{EChar = 1,EWChar = 2,EUtf8 = 4};private:char * m_cDest;wchar_t * m_wcDest;char * m_cUtf8;unsigned int m_nSrcType;public:char * Char(void) { return m_cDest; }wchar_t * WChar(void){ return m_wcDest; }bool IsNullChar(void) { return ( !m_cDest || g_NULL == m_cDest ); }bool IsNullWChar(void) { return ( !m_wcDest || g_NULL == (char*)m_wcDest ); }#if defined( _UTF8_ )char * UTF8(void) { return m_cUtf8; }bool IsNullUTF8(void) { return ( !m_cUtf8 || g_NULL == m_cUtf8 ); } #endifTCHAR * TChar(void){ #ifdef _UNICODEreturn WChar(); #elsereturn Char(); #endif}// ANSI/GBK 轉 Unicode和UTF8的構造函數CWCharToChar(const char* psrc, unsigned int nSrcType = EChar #if defined( _UTF8_ ), unsigned int nDestType = EUtf8) #else, unsigned int nDestType = EWChar) #endif: m_cDest(NULL), m_wcDest(NULL), m_cUtf8(NULL), m_nSrcType(nSrcType){// 防止空指針if( !psrc ) return;if( !*psrc ) // 如果是空字符串,也返回空字符串{if( EChar == m_nSrcType ) m_cDest = (char*)psrc;if( EUtf8 == m_nSrcType ) m_cUtf8 = (char*)psrc;if( nDestType & EChar ) m_cDest = g_NULL;if( nDestType & EUtf8 ) m_cUtf8 = g_NULL;if( nDestType & EWChar ) m_wcDest = (wchar_t*)g_NULL;return;}#ifdef OS_WINDOWSif( EChar == m_nSrcType ){m_cDest = (char*)psrc;#if defined( _UTF8_ )int nLen = MultiByteToWideChar (CP_ACP, 0, m_cDest, -1, NULL, 0);m_wcDest = new wchar_t[nLen];MultiByteToWideChar (CP_ACP, 0, m_cDest, -1, m_wcDest, nLen);nLen = WideCharToMultiByte(CP_UTF8, 0, m_wcDest, -1, NULL, 0, NULL, NULL);m_cUtf8 = new char[nLen + 1];WideCharToMultiByte (CP_UTF8, 0, m_wcDest, -1, m_cUtf8, nLen, NULL,NULL); #elseint nLen = MultiByteToWideChar (CP_ACP, 0, m_cDest, -1, NULL, 0);m_wcDest = new wchar_t[nLen];MultiByteToWideChar (CP_ACP, 0, m_cDest, -1, m_wcDest, nLen); #endif}else if( EUtf8 == m_nSrcType ){m_cUtf8 = (char*)psrc;int nLen = MultiByteToWideChar(CP_UTF8, 0, m_cUtf8, -1, NULL,0);m_wcDest = new wchar_t[nLen+1];MultiByteToWideChar(CP_UTF8, 0, m_cUtf8, -1, m_wcDest, nLen);nLen = WideCharToMultiByte(CP_ACP, 0, m_wcDest, -1, NULL, 0, NULL, NULL);m_cDest = new char[nLen + 1];WideCharToMultiByte(CP_ACP, 0, m_wcDest, -1, m_cDest, nLen, NULL,NULL);} #else // Linuxif( EChar == m_nSrcType ){m_cDest = (char*)psrc;if( nDestType & EUtf8 )do_iconv_convert(psrc, &m_cUtf8, "GBK", "UTF-8");if( nDestType & EWChar)do_iconv_convert(psrc, (char**)&m_wcDest, "GBK", "wchar_t");}else if( EUtf8 == m_nSrcType ){m_cUtf8 = (char*)psrc;if( nDestType & EChar)do_iconv_convert(psrc, &m_cDest, "UTF-8", "GBK");if( nDestType & EWChar)do_iconv_convert(psrc, (char**)&m_wcDest, "UTF-8", "wchar_t");} #endif}// Unicode 轉 ANSI/GBK和UTF8的構造函數CWCharToChar(const wchar_t * psrc #if defined( _UTF8_ ), unsigned int nDestType = EUtf8) #else, unsigned int nDestType = EChar) #endif: m_cDest(NULL), m_wcDest(NULL), m_cUtf8(NULL), m_nSrcType(EWChar){char * p = (char*)psrc;if( !p ) return ;m_wcDest = (wchar_t*)psrc;if( 0 == *p && 0 == *(p+1) ) // 如果是空字符串,也返回空字符串{if( nDestType & EChar ) m_cDest = g_NULL;if( nDestType & EUtf8 ) m_cUtf8 = g_NULL;return;}#ifdef OS_WINDOWS// ANSI/GBK{int nLen = WideCharToMultiByte(CP_OEMCP,NULL, m_wcDest,-1,NULL,0,NULL,FALSE);m_cDest = new char[nLen];WideCharToMultiByte (CP_OEMCP,NULL,m_wcDest,-1, m_cDest, nLen,NULL,FALSE);}#if defined( _UTF8_ ){int nLen = WideCharToMultiByte(CP_UTF8, 0, m_wcDest, -1, NULL, 0, NULL, NULL);m_cUtf8 = new char[nLen + 1];WideCharToMultiByte (CP_UTF8, 0, m_wcDest, -1, m_cUtf8, nLen, NULL,NULL);} #endif #else // Linuxif( nDestType & EChar)do_iconv_convert((char*)psrc, &m_cDest, "wchar_t", "GBK");if( nDestType & EUtf8)do_iconv_convert((char*)psrc, (char**)&m_cUtf8, "wchar_t", "UTF-8"); #endif}~CWCharToChar(){if( EChar == m_nSrcType ){if( m_wcDest && g_NULL != (char*)m_wcDest ) delete [] m_wcDest;if( m_cUtf8 && g_NULL != m_cUtf8 ) delete [] m_cUtf8;}else if( EWChar == m_nSrcType ){if( m_cDest && g_NULL != m_cDest) delete [] m_cDest;if( m_cUtf8 && g_NULL != m_cUtf8) delete [] m_cUtf8;}else if( EUtf8 == m_nSrcType ){if( m_cDest && g_NULL != m_cDest) delete [] m_cDest;if( m_wcDest && g_NULL != (char*)m_wcDest ) delete [] m_wcDest;}}// Using iconv for Linux #ifndef OS_WINDOWSint do_iconv_convert(const char* pSrc, char**ppOut, const char* pszFromCode, const char* pszToCode){iconv_t cd = iconv_open(pszToCode, pszFromCode);if(cd == (iconv_t)(-1)){printf("iconv_open failed, errno: %d - %s\n", errno, strerror(errno));*ppOut = g_NULL; // 為了防止給std::string賦值拋異常而導致程序終止return -1;}iconv(cd, NULL, NULL, NULL, NULL);size_t nSLen = 0, nOLen = 0;if( m_nSrcType == EWChar ) #ifdef OS_WINDOWSnSLen = wcslen((wchar_t*)pSrc) * 2; // 乘以2,轉換成char的長度 #else // LinuxnSLen = wcslen((wchar_t*)pSrc) * 4; // for Unicode -> GBK/UTF8, Linux 乘以4 #endifelsenSLen = strlen(pSrc);if( 0 == strcmp( pszToCode, "wchar_t"))nOLen = nSLen * 4; // for GBK -> UnicodeelsenOLen = nSLen * 2;size_t nORawLen = nOLen;char* pOut = new char[nOLen+4];char* pOutStart = pOut;char ** ppin = (char**)&pSrc;char ** ppout = &pOut; #ifdef _DEBUGprintf("Convert: %s[%lu] -> %s[%lu] bytes\n", pszFromCode, nSLen, pszToCode, nOLen); #endifsize_t ret = iconv(cd, (char**)ppin, &nSLen, (char**)ppout, &nOLen);if( 0 == ret ) // 轉換完成成功{iconv_close(cd);int nOutLen = nORawLen - nOLen;*(pOutStart + nOutLen) = 0;*(pOutStart + nOutLen + 1) = 0; // 給轉換Unicode之用*ppOut = pOutStart;return nOutLen;}else // 全部或部分錯誤{printf("iconv failed, errno: %d - %s\n", errno, strerror(errno));iconv_close(cd);delete [] pOutStart;*ppOut = g_NULL; // 為了防止給std::string賦值拋異常而導致程序終止return -1;}}#endifstatic const char* GetNullStr(void){ return g_NULL; } };#endif //__CHAR_CONVERT_H__

總結

以上是生活随笔為你收集整理的iconv 转换字符编码,兼容VC转换的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。