最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++實現(xiàn)編碼轉(zhuǎn)換的示例代碼

 更新時間:2020年08月14日 11:45:59   作者:gongluck  
這篇文章主要介紹了C++實現(xiàn)編碼轉(zhuǎn)換的示例代碼,幫助大家快捷的實現(xiàn)編碼轉(zhuǎn)換,感興趣的朋友可以了解下

代碼地址

https://github.com/gongluck/Code-snippet/tree/master/cpp/code%20conversion

需求

編碼轉(zhuǎn)換在實際開發(fā)中經(jīng)常遇到,通常是ANSI、Unicode和Utf-8之間相互轉(zhuǎn)換。實現(xiàn)也有很多種,有查表法、使用C++11、使用boost、使用系統(tǒng)API。C++11和boost幾乎可以實現(xiàn)一套代碼,在linux和windows都能使用,但實際會有很多坑,相當于代碼幾乎不改,但是要改一下系統(tǒng)環(huán)境。所以有一種實現(xiàn)就是判斷系統(tǒng)的版本,然后選擇不同的系統(tǒng)api進行編碼轉(zhuǎn)換。

實現(xiàn)

目前只實現(xiàn)Windows下的編碼轉(zhuǎn)換,以后需要在linux下使用編碼轉(zhuǎn)換再做補充。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++實現(xiàn)編碼轉(zhuǎn)換的示例代碼的詳細內(nèi)容,更多關(guān)于C++實現(xiàn)編碼轉(zhuǎn)換的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • C++ 私有析構(gòu)函數(shù)的作用示例詳解

    C++ 私有析構(gòu)函數(shù)的作用示例詳解

    這篇文章主要介紹了C++ 私有析構(gòu)函數(shù)的作用,私有析構(gòu)函數(shù)不會影響棧上對象的自動析構(gòu),它們會在其作用域結(jié)束時自動調(diào)用析構(gòu)函數(shù)。私有析構(gòu)函數(shù)主要影響的是對堆上對象的顯式刪除操作,需要的朋友可以參考下
    2023-06-06
  • 利用C語言編寫一個無限循環(huán)語句

    利用C語言編寫一個無限循環(huán)語句

    這篇文章主要介紹了利用C語言編寫一個無限循環(huán)語句問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • C++之關(guān)于string對象的大小比較

    C++之關(guān)于string對象的大小比較

    這篇文章主要介紹了C++之關(guān)于string對象的大小比較方式,具有很好的 參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • C語言實現(xiàn)二叉樹遍歷的迭代算法

    C語言實現(xiàn)二叉樹遍歷的迭代算法

    這篇文章主要介紹了C語言實現(xiàn)二叉樹遍歷的迭代算法,包括二叉樹的中序遍歷、先序遍歷及后序遍歷等,是非常經(jīng)典的算法,需要的朋友可以參考下
    2014-09-09
  • C++實現(xiàn)連連看游戲核心代碼

    C++實現(xiàn)連連看游戲核心代碼

    這篇文章主要為大家詳細介紹了C++實現(xiàn)連連看游戲核心代碼,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • C++實現(xiàn)關(guān)系與關(guān)系矩陣的代碼詳解

    C++實現(xiàn)關(guān)系與關(guān)系矩陣的代碼詳解

    這篇文章主要介紹了C++實現(xiàn)關(guān)系與關(guān)系矩陣,功能實現(xiàn)包括關(guān)系的矩陣表示,關(guān)系的性質(zhì)判斷及關(guān)系的合成,本文結(jié)合示例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-04-04
  • C語言開發(fā)中的常見錯誤詳解

    C語言開發(fā)中的常見錯誤詳解

    這個分欄是對于使用C語言編程過程中可能會出現(xiàn)的一些錯誤而進行的說明,更多的錯誤示例將會在后面的內(nèi)容里進行演示。希望這個分欄的內(nèi)容可以幫助剛學編程的小白少走一些彎路,以及吸取更多的編碼經(jīng)驗
    2022-05-05
  • C語言數(shù)據(jù)結(jié)構(gòu)之雙鏈表&循環(huán)鏈表&靜態(tài)鏈表詳解

    C語言數(shù)據(jù)結(jié)構(gòu)之雙鏈表&循環(huán)鏈表&靜態(tài)鏈表詳解

    這篇文章主要為大家詳細介紹了C語言數(shù)據(jù)結(jié)構(gòu)中雙鏈表&循環(huán)鏈表&靜態(tài)鏈表的原理與使用,文中的示例代碼講解詳細,感興趣的可以了解一下
    2022-09-09
  • C++中簡單的文本文件輸入/輸出示例詳解

    C++中簡單的文本文件輸入/輸出示例詳解

    C++程序把輸入和輸出看作字節(jié)流,輸入時程序從輸入流中抽取字節(jié),輸出時程序?qū)⒆止?jié)插入到輸出流中,下面這篇文章主要給大家介紹了關(guān)于C++中簡單的文本文件輸入/輸出的相關(guān)資料,需要的朋友可以參考下
    2021-12-12
  • c++中for雙循環(huán)的那些事

    c++中for雙循環(huán)的那些事

    本人很菜,今天看《C++編程思想》中的一道課后題中說到這樣一個問題。修改兩層嵌套的for循環(huán)的標識符,觀察結(jié)果變化
    2013-05-05

最新評論

昭通市| 泰和县| 兴化市| 大理市| 黄冈市| 广安市| 枣强县| 鄂温| 阳谷县| 西平县| 江孜县| 中阳县| 思茅市| 新竹县| 台前县| 邻水| 西昌市| 景宁| 和林格尔县| 剑川县| 金塔县| 伊吾县| 太湖县| 晋中市| 宁蒗| 石河子市| 红桥区| 庆阳市| 龙海市| 礼泉县| 诸城市| 安远县| 梁山县| 德惠市| 开远市| 修武县| 平安县| 海盐县| 延庆县| 兴山县| 扶余县|