C++實(shí)現(xiàn)編碼轉(zhuǎn)換的示例代碼
代碼地址
https://github.com/gongluck/Code-snippet/tree/master/cpp/code%20conversion
需求
編碼轉(zhuǎn)換在實(shí)際開發(fā)中經(jīng)常遇到,通常是ANSI、Unicode和Utf-8之間相互轉(zhuǎn)換。實(shí)現(xiàn)也有很多種,有查表法、使用C++11、使用boost、使用系統(tǒng)API。C++11和boost幾乎可以實(shí)現(xiàn)一套代碼,在linux和windows都能使用,但實(shí)際會(huì)有很多坑,相當(dāng)于代碼幾乎不改,但是要改一下系統(tǒng)環(huán)境。所以有一種實(shí)現(xiàn)就是判斷系統(tǒng)的版本,然后選擇不同的系統(tǒng)api進(jìn)行編碼轉(zhuǎn)換。
實(shí)現(xiàn)
目前只實(shí)現(xiàn)Windows下的編碼轉(zhuǎn)換,以后需要在linux下使用編碼轉(zhuǎn)換再做補(bǔ)充。windows下的編碼轉(zhuǎn)換基本圍繞unicode做處理。例如ANSI->UTF-8,就是先將ANSI->unicode,再將unicode->UTF-8。
// convert.h
/*
* @Author: gongluck
* @Date: 2020-03-23 16:06:23
* @Last Modified by: gongluck
* @Last Modified time: 2020-03-23 16:09:30
*/
// Character encoding conversion
#pragma once
#include <string>
namespace gconvert
{
// ANSI->Unicode
int ansi2uni(const std::string& ansi, std::wstring& uni);
// Unicode->ANSI
int uni2ansi(const std::wstring& uni, std::string& ansi);
// UTF8->Unicode
int utf82uni(const std::string& utf8, std::wstring& uni);
// Unicode->UTF8
int uni2utf8(const std::wstring& uni, std::string& utf8);
// ANSI->UTF8
int ansi2utf8(const std::string& ansi, std::string& utf8);
// UTF8->ANSI
int utf82ansi(const std::string& utf8, std::string& ansi);
} // namespace gconvert
//convert.cpp
/*
* @Author: gongluck
* @Date: 2020-03-23 16:13:01
* @Last Modified by: gongluck
* @Last Modified time: 2020-03-23 16:34:50
*/
#include "convert.h"
#include <iostream>
#ifdef _WIN32
#include <windows.h>
#endif
namespace gconvert
{
#ifdef _WIN32
static int multi2uni(const std::string& multi, std::wstring& uni, UINT code)
{
auto len = MultiByteToWideChar(code, 0, multi.c_str(), -1, nullptr, 0);
if (len <= 0)
{
std::cerr << __FILE__ << " : " << __LINE__ << " : " << GetLastError() << std::endl;
return -1;
}
WCHAR* buf = new WCHAR[len];
if (buf == nullptr)
{
std::cerr << __FILE__ << " : " << __LINE__ << " : " << "can not new buf, size : " << len << std::endl;
return -2;
}
len = MultiByteToWideChar(code, 0, multi.c_str(), -1, buf, len);
uni.assign(buf);
delete[]buf;
buf = nullptr;
return len;
}
static int uni2multi(const std::wstring& uni, std::string& multi, UINT code)
{
auto len = WideCharToMultiByte(code, 0, uni.c_str(), -1, nullptr, 0, nullptr, nullptr);
if (len <= 0)
{
std::cerr << __FILE__ << " : " << __LINE__ << " : " << GetLastError() << std::endl;
return -1;
}
CHAR* buf = new CHAR[len];
if (buf == nullptr)
{
std::cerr << __FILE__ << " : " << __LINE__ << " : " << "can not new buf, size : " << len << std::endl;
return -2;
}
len = WideCharToMultiByte(code, 0, uni.c_str(), -1, buf, len, nullptr, nullptr);
multi.assign(buf);
delete[]buf;
buf = nullptr;
return len;
}
#endif
// ANSI->Unicode
int ansi2uni(const std::string& ansi, std::wstring& uni)
{
#ifdef _WIN32
return multi2uni(ansi, uni, CP_ACP);
#endif
return 0;
}
// Unicode->ANSI
int uni2ansi(const std::wstring &uni, std::string &ansi)
{
#ifdef _WIN32
return uni2multi(uni, ansi, CP_ACP);
#endif
return 0;
}
// UTF8->Unicode
int utf82uni(const std::string& utf8, std::wstring& uni)
{
#ifdef _WIN32
return multi2uni(utf8, uni, CP_UTF8);
#endif
return 0;
}
// Unicode->UTF8
int uni2utf8(const std::wstring& uni, std::string& utf8)
{
#ifdef _WIN32
return uni2multi(uni, utf8, CP_UTF8);
#endif
return 0;
}
// ANSI->UTF8
int ansi2utf8(const std::string &ansi, std::string &utf8)
{
std::wstring uni;
auto len = ansi2uni(ansi, uni);
if (len <= 0)
{
return -3;
}
return uni2utf8(uni, utf8);
}
// UTF8->ANSI
int utf82ansi(const std::string &utf8, std::string &ansi)
{
std::wstring uni;
auto len = utf82uni(utf8, uni);
if (len <= 0)
{
return -3;
}
return uni2ansi(uni, ansi);
}
} // namespace gconvert
//testcode
#include <iostream>
#include "../code conversion/convert.h"
int main()
{
std::string ansi = "你好,世界!";
std::wstring uni;
std::string utf8;
ret = gconvert::ansi2uni(ansi, uni);
ret = gconvert::ansi2utf8(ansi, utf8);
ret = gconvert::uni2ansi(uni, ansi);
ret = gconvert::uni2utf8(uni, utf8);
ret = gconvert::utf82ansi(utf8, ansi);
ret = gconvert::utf82uni(utf8, uni);
return 0;
}
以上就是C++實(shí)現(xiàn)編碼轉(zhuǎn)換的示例代碼的詳細(xì)內(nèi)容,更多關(guān)于C++實(shí)現(xiàn)編碼轉(zhuǎn)換的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
利用C語(yǔ)言編寫一個(gè)無限循環(huán)語(yǔ)句
這篇文章主要介紹了利用C語(yǔ)言編寫一個(gè)無限循環(huán)語(yǔ)句問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11
C++之關(guān)于string對(duì)象的大小比較
這篇文章主要介紹了C++之關(guān)于string對(duì)象的大小比較方式,具有很好的 參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-11-11
C語(yǔ)言實(shí)現(xiàn)二叉樹遍歷的迭代算法
這篇文章主要介紹了C語(yǔ)言實(shí)現(xiàn)二叉樹遍歷的迭代算法,包括二叉樹的中序遍歷、先序遍歷及后序遍歷等,是非常經(jīng)典的算法,需要的朋友可以參考下2014-09-09
C++實(shí)現(xiàn)關(guān)系與關(guān)系矩陣的代碼詳解
這篇文章主要介紹了C++實(shí)現(xiàn)關(guān)系與關(guān)系矩陣,功能實(shí)現(xiàn)包括關(guān)系的矩陣表示,關(guān)系的性質(zhì)判斷及關(guān)系的合成,本文結(jié)合示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-04-04
C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)之雙鏈表&循環(huán)鏈表&靜態(tài)鏈表詳解
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)中雙鏈表&循環(huán)鏈表&靜態(tài)鏈表的原理與使用,文中的示例代碼講解詳細(xì),感興趣的可以了解一下2022-09-09

