zoukankan      html  css  js  c++  java
  • 【C/C++】字符串编码转换【Windows版】

    StrConv.h

    View Code
    #pragma once
    #include <string>
           
    #ifdef _UNICODE
    
    #ifndef tchar
    #define tchar wchar_t
    #endif
    #ifndef tstring
    #define tstring std::wstring
    #endif
    
    #else
    
    #ifndef tchar
    #define tchar char
    #endif
    #ifndef tstring
    #define tstring std::string
    #endif
    
    #endif    // _UNICODE
    
    //////////////////////////////////////////////////////////////////////////
    // ANSI <-> UTF8 <-> UTF16
    //////////////////////////////////////////////////////////////////////////
    std::wstring AnsiToUtf16(const std::string& str);
    std::string Utf16toUtf8(const std::wstring& str);
    std::string AnsiToUtf8(const std::string& str);
    
    std::string TStrToUtf8(const tstring& str);
    
    std::wstring Utf8ToUtf16(const std::string& str);
    std::string Utf16ToAnsi(const std::wstring& str);
    std::string Utf8ToAnsi(const std::string& str);
    
    tstring Utf8ToTStr(const std::string& str);
    
    #ifdef _UNICODE
    #define TStrToAnsi(str) Utf16ToAnsi(str)
    #define TStrToUtf16(str) (str)
    
    #define AnsiToTStr(str) AnsiToUtf16(str)
    #define Utf16ToTStr(str) (str)
    #else
    #define TStrToAnsi(str) (str)
    #define TStrToUtf16(str) AnsiToUtf16(str)
    
    #define AnsiToTStr(str) (str)
    #define Utf16ToTStr(str) Utf16ToAnsi(str)
    #endif

    StrConv.cpp

    View Code
    #include "StrConv.h"
    #include <windows.h>
    
    std::wstring AnsiToUtf16(const std::string& str)
    {
        std::wstring res;
        int bufferSize = MultiByteToWideChar(CP_ACP, 0, str.c_str(), (int)str.size() + 1, NULL, 0);
        if (bufferSize)
        {
            wchar_t* buffer = new wchar_t[bufferSize];
            if (MultiByteToWideChar(CP_ACP, 0, str.c_str(), (int)str.size() + 1, buffer, bufferSize))
                res = buffer;
            delete[] buffer;
            buffer = NULL;
        }
    
        return res;
    }
    
    std::string Utf16toUtf8(const std::wstring& str)
    {
        std::string res;
        int bufferSize = WideCharToMultiByte(CP_UTF8, 0, str.c_str(), (int)str.size() + 1, NULL, 0, NULL, NULL);
        if (bufferSize)
        {
            char* buffer = new char[bufferSize];
            if (WideCharToMultiByte(CP_UTF8, 0, str.c_str(), (int)str.size() + 1, buffer, bufferSize, NULL, NULL))
                res = buffer;
            delete[] buffer;
            buffer = NULL;
        }
    
        return res;
    }
    
    std::string AnsiToUtf8(const std::string& str)
    {
        return Utf16toUtf8(AnsiToUtf16(str));
    }
    
    std::string TStrToUtf8(const tstring& str)
    {
    #ifdef _UNICODE
        return Utf16toUtf8(str);
    #else
        return AnsiToUtf8(str);
    #endif
    }
    
    std::wstring Utf8ToUtf16(const std::string& str)
    {
        std::wstring res;
        int bufferSize = MultiByteToWideChar(CP_UTF8, 0, str.c_str(), (int)str.size() + 1, NULL, 0);
        if (bufferSize)
        {
            wchar_t* buffer = new wchar_t[bufferSize];
            if (MultiByteToWideChar(CP_UTF8, 0, str.c_str(), (int)str.size() + 1, buffer, bufferSize))
                res = buffer;
            delete[] buffer;
            buffer = NULL;
        }
    
        return res;
    }
    
    std::string Utf16ToAnsi(const std::wstring& str)
    {
        std::string res;
        int bufferSize = WideCharToMultiByte(CP_ACP, 0, str.c_str(), (int)str.size() + 1, NULL, 0, NULL, NULL);
        if (bufferSize)
        {
            char* buffer = new char[bufferSize];
            if (WideCharToMultiByte(CP_ACP, 0, str.c_str(), (int)str.size() + 1, buffer, bufferSize, NULL, NULL))
                res = buffer;
            delete[] buffer;
            buffer = NULL;
        }
    
        return res;
    }
    
    std::string Utf8ToAnsi(const std::string& str)
    {
        return Utf16ToAnsi(Utf8ToUtf16(str));
    }
    
    tstring Utf8ToTStr(const std::string& str)
    {
    #ifdef _UNICODE
        return Utf8ToUtf16(str);
    #else
        return Utf8ToAnsi(str);
    #endif
    }
  • 相关阅读:
    数据解析1127
    数据解析1119
    数据解析1114
    数据解析1122
    数据解析1121
    数据解析1120
    数据解析1116
    数据解析1128
    Twitter惊现新型病毒 每分钟159条速率分散
    宏达电预计本年有望在台湾市场击败诺基亚
  • 原文地址:https://www.cnblogs.com/jeJee/p/2675072.html
Copyright © 2011-2022 走看看