C++字符串编码转换
C++中字符串有很多种类,详情参考C++中的字符串类型。本文主要以string类型为例,讲一下字符串的编码,选择string主要是因为:
- byte是字符串二进制编码的最小结构,字符串本质上就是一个byte数组
- C++没有byte类型,第三方的byte类型通常是char实现的
- char可以直接转换成string,也就是说byte直接转string
代码转自utf8与std::string字符编码转换,其它编码格式的转换方法类似(先转双字节Unicode编码,再通过转换为其它编码的多字节),代码如下:
#include <windows.h>
std::string UTF8_To_string(const std::string& str)
{
int nwLen = MultiByteToWideChar(CP_UTF8, 0, str.c_str(), -1, NULL, 0);
wchar_t* pwBuf = new wchar_t[nwLen + 1];//加1用于截断字符串
memset(pwBuf, 0, nwLen * 2 + 2);
MultiByteToWideChar(CP_UTF8, 0, str.c_str(), str.length(), pwBuf, nwLen);
int nLen = WideCharToMultiByte(CP_ACP, 0, pwBuf, -1, NULL, NULL, NULL, NULL);
char* pBuf = new char[nLen + 1];
memset(pBuf, 0, nLen + 1);
WideCharToMultiByte(CP_ACP, 0, pwBuf, nwLen, pBuf, nLen, NULL, NULL);
std::string retStr = pBuf;
delete[]pBuf;
delete[]pwBuf;
pBuf = NULL;
pwBuf = NULL;
return retStr;
}
std::string string_To_UTF8(const std::string& str)
{
int nwLen = ::MultiByteToWideChar(CP_ACP, 0, str.c_str(), -1, NULL, 0);
wchar_t* pwBuf = new wchar_t[nwLen + 1];//加1用于截断字符串
ZeroMemory(pwBuf, nwLen * 2 + 2);
::MultiByteToWideChar(CP_ACP, 0, str.c_str(), str.length(), pwBuf, nwLen);
int nLen = ::WideCharToMultiByte(CP_UTF8, 0, pwBuf, -1, NULL, NULL, NULL, NULL);
char* pBuf = new char[nLen + 1];
ZeroMemory(pBuf, nLen + 1);
::WideCharToMultiByte(CP_UTF8, 0, pwBuf, nwLen, pBuf, nLen, NULL, NULL);
std::string retStr(pBuf);
delete[]pwBuf;
delete[]pBuf;
pwBuf = NULL;
pBuf = NULL;
return retStr;
}
注:string使用的ANSI编码,在简体中文系统下ANSI编码代表GB2312编码。
MultiByteToWideChar和WideCharToMultiByte用法参考MultiByteToWideChar和WideCharToMultiByte用法详解,方法的第一个参数是指定指针所指字符串内存的编码格式,内容如下:
| Value | Description |
|---|---|
| CP_ACP | ANSI code page |
| CP_MACCP | Not supported |
| CP_OEMCP | OEM code page |
| CP_SYMBOL | Not supported |
| CP_THREAD_ACP | Not supported |
| CP_UTF7 | UTF-7 code page |
| CP_UTF8 | UTF-8 code page |
两个方法都会调用两次,第一次调用最后一个参数(目标字符串长度)为0,方法返回目标字符串长度的长度。第二次调用时,最后一个参数传入目标字符串长度+1,直接在缓冲区写入转换后的字符串。
注:在linux下也有类似的两个函数:mbstowcs()、wcstombs(),使用方法参考https://blog.csdn.net/yiyaaixuexi/article/details/6174971。
C++字符串编码转换的更多相关文章
- 完整的java字符串编码转换代码
package book.String; import java.io.UnsupportedEncodingException; /** *//** * 转换字符串的编码 * @author joe ...
- JAVA字符串编码转换常用类
无论是对程序的本地化还是国际化,都会涉及到字符编码的转换的问题.尤其在web应用中常常需要处理中文字符,这时就需要进行字符串的编码转换,将字符串编码转换为GBK或者GB2312.一.关键技术点: ...
- java字符串应用之字符串编码转换
[转载]原文地址:https://blog.csdn.net/zhouyong80/article/details/1900100 无论是对程序的本地化还是国际化,都会涉及到字符编码的转换的问题.尤其 ...
- loadrunner 脚本开发-字符串编码转换
字符串编码转换 by:授客 QQ:1033553122 相关函数 lr_convert_string_encoding函数 功能:字符串编码转换 原型: int lr_convert_string ...
- JAVA 字符串编码转换
/** * 字符串编码转换的实现方法 * @param str 待转换编码的字符串 * @param newCharset 目标编码 * @return * @throws UnsupportedEn ...
- java中字符串编码转换
Java 正确的做字符串编码转换 字符串的内部表示? 字符串在java中统一用unicode表示( 即utf-16 LE) , 对于 String s = "你好哦!"; 如果源码 ...
- js 字符串编码转换函数
escape 方法 对 String 对象编码以便它们能在所有计算机上可读, escape(charString) 必选项 charstring 参数是要编码的任意 String 对象或文字. 说明 ...
- python中字符串编码转换
字符串编码转换程序员最苦逼的地方,什么乱码之类的几乎都是由汉字引起的. 其实编码问题很好搞定,只要记住一点: 任何平台的任何编码,都能和Unicode互相转换. UTF-8与GBK互相转换,那就先把U ...
- Qt5字符串编码转换学习
目录 1.通过Python3示例探索常用字符串编码 UTF8 ANSI Unicode 小结 2.Qt5中使用QTextCodec进行编码转换 小结 1.通过Python3示例探索常用字符串编码 下面 ...
- PHP --字符串编码转换(自动识别原编码)
/** * 对数据进行编码转换 * @param array/string $data 数组 * @param string $output 转换后的编码 */ function array_icon ...
随机推荐
- 4.3 Windows驱动开发:监控进程与线程对象操作
在内核中,可以使用ObRegisterCallbacks这个内核回调函数来实现监控进程和线程对象操作.通过注册一个OB_CALLBACK_REGISTRATION回调结构体,可以指定所需的回调函数和回 ...
- Axure谷歌浏览器扩展程序下载及安装方法(免FQ)
在用Axure在chrome查看原型时,没有安装Axure谷歌浏览器插件时无法显示会有提示信息,如果未FQ按照提示是无法直接安装扩展程序的,这里提供插件下载地址并教大家如何安装插件. 平时在使用谷歌浏 ...
- 我管你什么okr还是kpi,PPT轻松交给你
word一键转ppt 通过[文件]→[选项]→[快速访问工具栏],选择[不在功能区中的命令],找到[发送到Microsoft PowerPoint ],单击[添加]后再[确定] 调出功能按钮后,就可以 ...
- Visual Studio 2017高级编程(第7版)中文版
发布一个Visual Studio 2017的编程书籍: 链接:https://pan.baidu.com/s/1-RL9wkNYXwvQOdWrnAsSZQ 提取码:ig0c
- npm i -D和-s及-g以及--save的那些事
i 是 install 的简写 -S 就是 --save 的简写 -D 就是 --save-dev 的简写 npm i module_name -S = > npm install modu ...
- Visual Studio部署matplotlib绘图库的C++版本
本文介绍在Visual Studio软件中配置.编译C++环境下matplotlibcpp库的详细方法. matplotlibcpp库是一个C++环境下的绘图工具,其通过调用Python接口, ...
- 使用HttpServletResponse实现curl接口时控制台输出(续)
上一篇文章的问题 在上一篇文章 Spring Boot RestController接口如何输出到终端 中讨论了如何使用 HttpSerlvetResponse 写入输出流,使应急接口通过 curl ...
- SP277 CTGAME - City Game 题解
题目传送门 前置知识 单调栈 解法 令 \(f_{i,j}(1 \le i \le n,1 \le j \le m)\) 表示从 \((1,j)\) 到 \((i,j)\) 中以 \((i,j)\) ...
- JS axios cancelToken 是如何实现取消请求?稍有啰嗦但超有耐心的 axios 源码分析
壹 ❀ 引 axios,一个基于promise且对ajax进行了二次封装的http库,在提供了与promise类似的API便捷写法同时,它还有一大特点,便是支持取消http请求.当然取消请求并不是ax ...
- ARP(Address Resolution Protocol) Packet
Address Resolution Protocol The Address Resolution Protocol (ARP) is a communication protocol used f ...