iconv 转换字符编码,兼容VC转换
生活随笔
收集整理的這篇文章主要介紹了
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转换的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Flutter Align控件用法
- 下一篇: 四柱八字大全 php,四柱八字