utf8_to_utf16
|
17down voteaccepted
|
Here's some code. Only lightly tested and there's probably a few improvements. Call this function to convert a UTF-8 string to a UTF-16 wstring. If it thinks the input string is not UTF-8 then it will throw an exception, otherwise it returns the equivalent UTF-16 wstring.
|
http://stackoverflow.com/questions/7153935/how-to-convert-utf-8-stdstring-to-utf-16-stdwstring
#pragma once
#include <string> #ifdef tstring
#error "\"tstring\" Macro has been defined."
#else
#ifdef _UNICODE
#define tstring wstring
#else
#define tstring string
#endif
#endif class EncodingConverter
{
public:
static int AnsiStrToWideStr(std::string& strSrc, std::wstring& strDest)
{
int nLen = strSrc.length() + ;
int nRet = ; nLen *= sizeof(wchar_t); wchar_t* pszW = new wchar_t[nLen];
memset(pszW, , nLen); nRet = MultiByteToWideChar(CP_ACP, , strSrc.c_str(), -, pszW, nLen); strDest = pszW;
delete[] pszW; return nRet;
}; static int WideStrToAnsiStr(std::wstring& strSrc, std::string& strDest)
{
int nLen = strSrc.length() + ;
int nRet = ; nLen *= sizeof(wchar_t); char* pszA = new char[nLen];
memset(pszA, , nLen); nRet = WideCharToMultiByte(CP_ACP, , strSrc.c_str(), -, pszA, nLen, NULL, NULL); strDest = pszA;
delete[] pszA; return nRet;
}; static int AnsiStrToTStr(std::string& strSrc, std::tstring& strDest)
{
int nRet = ; #ifdef _UNICODE
nRet = AnsiStrToWideStr(strSrc, strDest);
#else
strDest = strSrc;
nRet = strDest.length();
#endif return nRet;
}; static int TStrToAnsiStr(std::tstring& strSrc, std::string& strDest)
{
int nRet = ; #ifdef _UNICODE
nRet = WideStrToAnsiStr(strSrc, strDest);
#else
strDest = strSrc;
nRet = strDest.length();
#endif return nRet;
}; static int WideStrToTStr(std::wstring& strSrc, std::tstring& strDest)
{
int nRet = ; #ifdef _UNICODE
strDest = strSrc;
nRet = strDest.length();
#else
nRet = WideStrToAnsiStr(strSrc, strDest);
#endif return nRet;
}; static int TStrToWideStr(std::tstring& strSrc, std::wstring& strDest)
{
int nRet = ; #ifdef _UNICODE
strDest = strSrc;
nRet = strDest.length();
#else
nRet = AnsiStrToWideStr(strSrc, strDest);
#endif return nRet;
}; static std::string ToAnsiString(const wchar_t* lpStr)
{
std::wstring wide_string = lpStr;
std::string ansi_string; WideStrToAnsiStr(wide_string, ansi_string);
return ansi_string;
}; static std::string ToAnsiString(const char* lpStr)
{
return std::string(lpStr);
}; static std::wstring ToWideString(const wchar_t* lpStr)
{
return std::wstring(lpStr);
}; static std::wstring ToWideString(const char* lpStr)
{
std::string ansi_string = lpStr;
std::wstring wide_string; AnsiStrToWideStr(ansi_string, wide_string);
return wide_string;
}; static std::tstring ToTString(const char* lpStr)
{
#ifdef _UNICODE
return ToWideString(lpStr);
#else
return ToAnsiString(lpStr);
#endif
}; static std::tstring ToTString(const wchar_t* lpStr)
{
#ifdef _UNICODE
return ToWideString(lpStr);
#else
return ToAnsiString(lpStr);
#endif
}; static int WideStrToUtf8Str(std::wstring& strSrc, std::string& strDest)
{
int nRet = ;
int nLen = ; nLen = WideCharToMultiByte(CP_UTF8, , strSrc.c_str(), -, NULL, , NULL, NULL); char * lpUtf8Str = new char[nLen+];
memset(lpUtf8Str, , nLen);
nRet = WideCharToMultiByte(CP_UTF8, , strSrc.c_str(), -, lpUtf8Str, nLen, NULL, NULL);
strDest = lpUtf8Str;
delete[] lpUtf8Str; return nRet;
}; static int AnsiStrToUtf8Str(std::string& strSrc, std::string& strDest)
{
int nRet = ;
std::wstring wide_string; nRet = AnsiStrToWideStr(strSrc, wide_string);
nRet = WideStrToUtf8Str(wide_string, strDest); return nRet;
}; static int Utf8StrToWideStr(const std::string& strSrc, std::wstring& strDest)
{
int nRet = ;
int nLen = ; nLen = MultiByteToWideChar(CP_UTF8, , strSrc.c_str(), -, NULL, ); wchar_t* lpWideStr = new wchar_t[nLen];
memset(lpWideStr, , nLen*sizeof(lpWideStr[]));
nRet = MultiByteToWideChar(CP_UTF8, , strSrc.c_str(), -, lpWideStr, nLen);
strDest = lpWideStr;
delete[] lpWideStr; return nRet;
}; static int Utf8StrToAnsiStr(const std::string& strSrc, std::string& strDest)
{
int nRet = ;
std::wstring wide_string; nRet = Utf8StrToWideStr(strSrc, wide_string);
nRet = WideStrToAnsiStr(wide_string, strDest); return nRet;
}; static int Utf8StrToTStr(const std::string& strSrc, std::tstring& strDest)
{
#ifdef UNICODE
return Utf8StrToWideStr(strSrc, strDest);
#else
return Utf8StrToAnsiStr(strSrc, strDest);
#endif
}; static std::string ToUtf8String(const std::string& str)
{
std::string ansi_string = str;
std::string utf8_string; AnsiStrToUtf8Str(ansi_string, utf8_string);
return utf8_string;
}; static std::string ToUtf8String(const std::wstring& str)
{
std::wstring wide_string = str;
std::string utf8_string; WideStrToUtf8Str(wide_string, utf8_string);
return utf8_string;
};
};
https://github.com/yaocoder/utility/blob/master/src/common/EncodingConverter.h
utf8_to_utf16的更多相关文章
- boost::xml——基本操作以及中文乱码解决方案 (续)
本博文主要想说明以下两点: 1.对于上一篇的<boost::xml——基本操作以及中文乱码解决方案>解释,这篇博文基本解决了正确输入输出中英文问题,但是好像还没有解决修改中文出现乱码的问题 ...
- C++ MFC std::string转为 std::wstring
std::string转为 std::wstring std::wstring UTF8_To_UTF16(const std::string& source) { unsigned long ...
- 谷歌拼音自带lua
function fast_string_banji(argument) return {"快捷1", "快捷2", "快捷3", &quo ...
- 谷歌拼音输入法扩展API开发指南
为了帮助开发者在谷歌拼音输入法的基本输入功能基础上,开发和定义更丰富的扩展输入功能,谷歌拼音输入法提供了以Lua脚本编程语言为基础的输入法扩展API.利用输入法扩展API,开发者可以编写自定义的输入功 ...
随机推荐
- 使用内省方式操作JavaBean
内省,英文中称作introspector.主要对javaBean进行操作,JavaBean是一个特殊的Java类,该类中方法名符合特定的规则(其实就是getXXX,setXXX),我们一般是利用get ...
- 使用泛型定义一个可重用的Dao
dao用来和数据库进行交互,一个项目中,可能有用户表,产品表等等,不可能为每一个表都建立一个dao,使用泛型可以实现通吃. UserDao.java public class UserDao < ...
- git提交时的冲突处理
转自http://www.cnblogs.com/mengdd/p/3585038.html 当两条分支对同一个文件的同一个文本块进行了不同的修改,并试图合并时,Git不能自动合并的,称之为冲突(co ...
- 类似与三元表达式的 json 读取值
需要先在项目中添加 json的dll json 序列里面的key在item.feeType里面必须存在 否则会报 未将对象引用到实例 myDr["feeType"] = Newto ...
- c#中string.trimstart() 和string.trimend() 的用法
trim(),trimstart(),trimend()这样写是去掉空格,trimstart(a)是去掉字符串开始包含char[] a的字符,trimend同trimstart. 例:char[] a ...
- Devexpress 使用经验 —— ASPxGridView前后台交互写法推荐
这里的格式是仁者见仁智者见智,这篇随笔只是我在工作过程中总结出的阅读性高,对我来说效率较高的写法. ASPX: <dx:ASPxGridView ID="ASPxGridViewLin ...
- 读取 xml 文件 获取其中保存的数据信息
建立一个存储过程来返回要读取的数据形成结果集: CREATE PROC dbo.getValuesFromXmlByPath@fileName NVARCHAR(128)asDECLARE @T XM ...
- hibernate 其中七种关联关系
写的很好 http://blog.csdn.net/qq_27550755/article/details/50070017
- MySQL常见问题汇总(原创)
本文记录了使用Mysql时遇到的问题,持续更新中... 1.在windows命令行下登录mysql时报错: C:\Program Files\MySQL\MySQL Server 5.0\bin> ...
- POJ 1564(HDU 1258 ZOJ 1711) Sum It Up(DFS)
题目链接:http://poj.org/problem?id=1564 题目大意:给定一个整数t,和n个元素组成的集合.求能否用该集合中的元素和表示该整数,如果可以输出所有可行解.1<=n< ...