C++ wchar_t *和char * 互转

2023-05-16

转自:https://blog.csdn.net/lightspear/article/details/54695123

说道wchar_t和char两个类型大家都不会陌生

wchar_t:在windows下是Unicode 16编码,也就是俗称宽字节

char:当然就是指一个字节,在windows下面默认是gbk编码的

 

所以在windows 下 wchar_t 转 char也就是编码转化

 

直接贴出wchar_t *字符串和char *字符串的集中互转方法

方法一:利用Windows的宏W2A,A2W

 

 


   
  1. USES_CONVERSION;

  2. char* test1 = W2A(L"我是宽字节");//转化成默认

  3. wchar_t* test12 = A2W("我是窄字节");


 

 

方法二:利用Windows里的ATL里面的类CW2A和CA2W,在转换时候还可以顺便调整编码,不加第二个参数就是保持GBK不变

 


   
  1. std::string test3 = CW2A(L"中文字符", CP_UTF8);//一般可以加一下第二个参数,顺便切换编码

  2. std::wstring test4 = CA2W("中文字符");//一般不用加第二个参数


 

 

方法三:利用Windows API中的函数 WideCharToMultiByte 和 MultiByteToWideChar ,而且也是可以带自定义编码转换

以下函数用法: CharToWchar可以等效于CW2A,WcharToChar可以等效于CA2W

 


   
  1. std::wstring CharToWchar(const char* c, size_t m_encode = CP_ACP)

  2. {

  3. std::wstring str;

  4. int len = MultiByteToWideChar(m_encode, 0, c, strlen(c), NULL, 0);

  5. wchar_t* m_wchar = new wchar_t[len + 1];

  6. MultiByteToWideChar(m_encode, 0, c, strlen(c), m_wchar, len);

  7. m_wchar[len] = '\0';

  8. str = m_wchar;

  9. delete m_wchar;

  10. return str;

  11. }

  12.  
  13. std::string WcharToChar(const wchar_t* wp, size_t m_encode = CP_ACP)

  14. {

  15. std::string str;

  16. int len = WideCharToMultiByte(m_encode, 0, wp, wcslen(wp), NULL, 0, NULL, NULL);

  17. char *m_char = new char[len + 1];

  18. WideCharToMultiByte(m_encode, 0, wp, wcslen(wp), m_char, len, NULL, NULL);

  19. m_char[len] = '\0';

  20. str = m_char;

  21. delete m_char;

  22. return str;

  23. }



方法四:将使用标准C的mbstowcs方法和wcstombs方法,且配合标准C的setlocale方法,这也是利用标准库跨平台的做法,

 

但是过程没法直接转成自定义的编码,需要额外转码。所以在Windows平台开发的话不推荐。

注意:方法四将留在后面的blog和iconv库一起作为笔记

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ wchar_t *和char * 互转 的相关文章

  • 删除“NUL”字符

    我的记事本 中有这样的字符 当我尝试复制整行时 我实际上正在复制所有内容 直到 NUL File 1 我想做的就是替换那些空的 什么都没有 这样我就可以复制我的整行 也许有任何关键字可以告诉记事本 或任何其他可能有帮助的程序 替换这些字符
  • 通过添加“0”将整数转换为字符 - 发生了什么?

    我有一个像这样的简单程序 include
  • C++ 流式传输到 char 数组?

    我目前正在开发一个 C 应用程序 该应用程序使用一个 C 库 需要从我这边实现回调 例如回调定义如下 int onWrite char what char buffer size t size off t offset 我有 std set
  • 如何区分 malloc 字符串和字符串文字?

    有没有一种方法 在纯C中 来区分malloc从字符串文字中提取字符串 而不知道哪个是哪个 严格来说 我试图找到一种方法来检查变量是否是 malloced 字符串 如果是 我将释放它 如果没有 我就放手 当然 我可以向后挖掘代码并确定变量是否
  • 在运行时将 char[x] 大小调整为 char[y]

    好吧 我希望我能正确解释这一点 我有一个结构 typedef struct MyData char Data 256 int Index MyData 现在 我遇到了一个问题 大多数时候MyData Data256 就可以了 但在某些情况下
  • 在 C 中正确地将 const void 指针转换为 const char 指针数组

    我有一段 C 代码 如下所示 const char foo 2 bar Now bar 是一个返回 a 的函数 const void 我如何正确地投射这个const指针 该代码从 GCC 产生此警告 initialization disca
  • 如何将此代码转换为使用字符串

    char recursivecombo char str int choices int level int len strlen str level if level choices for int i 0 i lt len 2 i pr
  • 从文件中读取为 char 数组

    我正在从文件中读取 当我读取时 它会逐行读取并打印它 我想要的正是我想要一个 char 数组来保存文件中的所有字符并打印一次 这是我的代码 if strcmp str 0 0 FILE filecomand char fname 40 ch
  • 如果在某些输入之后使用 getline() 则不起作用[重复]

    这个问题在这里已经有答案了 可能的重复 需要有关 getline 的帮助 https stackoverflow com questions 1744665 need help with getline getline 不起作用 如果我在一
  • C 字符值算术

    我一直在阅读 C 编程语言 一书来学习 C 我偶然发现了算术s i 0 他们说它给出了存储在 s i 中的字符的数值 我不太明白 它怎么能通过减法给出值呢 注意 这用在 atoi 函数中 该函数将数字字符串转换为其等价的数字 谢谢 可能重复
  • "" 和 " " 之间有什么区别,如何根据字符测试前者?

    在Java中 空引号 和 带有单个空格的引号 之间有什么区别以及如何测试前者char 代表空字符串 is not空 它包含一个空格字符 你不能用以下方式来测试前者char 因为没有字符 用 a 来测试它String 它是String长度为零
  • gdb:调试 VS 代码时数组中<错误读取变量>

    我在调试期间尝试查看数组的内容时遇到问题 我看到的不是字符 My code include
  • C问题:为什么char实际上占用了4个字节的内存?

    我写了一个小程序来检查 char 在内存中占用了多少字节 它显示 char 实际上在内存中占用了 4 个字节 我知道这主要是因为字对齐 并且没有看到 char 只有 1 个字节的优势 为什么不使用 4 个字节作为 char int main
  • C 中的十六进制到字符数组

    Given a string of hex values i e e g 0011223344 so that s 0x00 0x11 etc 如何将这些值添加到 char 数组 相当于说 char array 4 0x00 0x11 您无
  • 强制 telnet 客户端进入字符模式

    我有一个应用程序 我接受来自 telnet 客户端的套接字连接 并建立一个简单的键盘驱动的字符 GUI telnet 客户端 至少在 Linux 上 默认为一次一行模式 所以我总是必须这样做 mode char手动 浏览相关 RFC 表明
  • 如何获取字符串的前五个字符

    我读过这个获取第一个字符的问题 https stackoverflow com q 3878820 1716774字符串的 有没有办法从 C 中的字符串中获取前 n 个字符 您可以使用可枚举 Take http msdn microsoft
  • 实现 `memcpy()`:需要 `unsigned char *`,还是只需要 `char *`?

    我正在实施一个版本memcpy 能够与它一起使用volatile 使用安全吗char 或者我需要unsigned char volatile void memcpy v volatile void dest const volatile v
  • gcc 内部使用相同的位表示 int 和 char 吗?

    我只是为了好玩而玩弄 unicode 字符 不使用 wchar t 支持 我只使用常规的 char 数据类型 我注意到 当以十六进制打印它们时 它们显示了完整的 4 个字节 而不是仅一个字节 对于前 考虑这个 c 文件 include
  • Java中的字符算术

    在玩的过程中 我遇到了一些对我来说似乎很奇怪的事情 以下不是有效的 Java 代码 char x A x x 1 possible loss of precision 因为其中一个操作数是整数 所以另一个操作数被转换为整数 结果无法分配给字
  • C++:获取数组中char元素的索引

    我需要获取数组中的字符数 const char myarray 5 0 a e f c Create array of char int number 0 Create variable number getposition myarray

随机推荐

  • 基于RobHess的SIFT图像拼接知识点随笔

    1 SIFT算法具有尺度不变性在于构建的高斯尺度空间 xff1b 2 SIFT算法具有旋转不变性在于特征方向向量 xff1b 3 K d数以图像特征点的128维特征描述子均值为依据进行划分 构建 xff1b 4 特征点匹配是一个图像的所有特
  • 最小二乘法及OpenCv函数

    1 最小二乘法 我们以最简单的一元线性模型来解释最小二乘法 什么是一元线性模型呢 xff1f 监督学习中 xff0c 如果预测的变量是离散的 xff0c 我们称其为分类 xff08 如决策树 xff0c 支持向量机等 xff09 xff0c
  • Linux服务器网络不通情况分析以及常见检查方法

    在实际运维过程中 xff0c 经常会遇到网路不通的问题 xff0c 一般此类网络不通的问题都是业务端到端的排查 本文从后端linux服务器端自查是否服务器问题 通过多年的运维经验总结 xff0c 服务器端问题导致网络不通 xff0c 大致分
  • RANSAC算法实现去除误匹配并计算拼接矩阵-随笔

    1 RANSAC算法实现去除误匹配并计算拼接矩阵流程 1 从样本集中随机抽选一个RANSAC样本 xff0c 即4个匹配点对 xff08 至少4个匹配点对 xff0c 才能计算出3 3变换矩阵 xff09 xff1b 2 计算当错误概率为0
  • linux c++ 服务器端开发面试必看书籍

    由于很多朋友希望加入到Linux c 43 43 服务器端开发的队伍中 xff0c 本人就结合自己的面试经历并整理了自己阅读的相关书籍 xff0c 同大家分享 xff0c 一起进步 人个认为以下是进入这个方向的必看书籍 xff0c 各系列难
  • C++进阶—>const、define和enum的区别和用途

    1 区别 这三种都可以定义常量 define是宏定义 xff0c 编译器不对其进行错误检查 xff0c 在预编译阶段处理 xff0c 没有作用域限制属于全局常量 xff0c 在程序中编译器会对定义的常量名以数值进行替换 xff0c 且每次替
  • MFC中基于OpenCV实现Picture Control控件成像方法

    MFC中基于OpenCV实现Picture Control控件成像方法有两种 xff0c 一种是OpenCV2 2以前版本的绘制 xff0c 另外一种是OpenCV2 2以后版本的绘制 xff08 1 xff09 在OpenCV2 2之前的
  • MFC中CFileDialog及SHBrowseForFolder

    MFC中实现通过按钮来选择文件路径或文件夹路径 xff1b xff08 1 xff09 CFileDialog类能够选择文件 xff0c 并获取其路径 xff08 当然也可以通过获取文件路径再去除文件名而获得其所在文件夹路径 xff0c 前
  • C++进阶—>带你理解多字节编码与Unicode码

    本篇文章将讲解C 43 43 开发中容易混淆的另一个概念 多字节字符集与Unicode字符集 多字节字符与宽字节字符 char与wchar t 我们知道C 43 43 基本数据类型中表示字符的有两种 xff1a char wchar t c
  • BP神经网络及其C++实现

    0 前言 神经网络在我印象中一直比较神秘 xff0c 正好最近学习了神经网络 xff0c 特别是对Bp神经网络有了比较深入的了解 xff0c 因此 xff0c 总结以下心得 xff0c 希望对后来者有所帮助 神经网络在机器学习中应用比较广泛
  • C++进阶—>Socket通信那点事

    1 网络中进程之间如何通信 xff1f 本地的进程间通信 xff08 IPC xff09 有很多种方式 xff0c 但可以总结为下面4类 xff1a 消息传递 xff08 管道 FIFO 消息队列 xff09 同步 xff08 互斥量 条件
  • C++进阶—>线程同步随笔

    线程同步主要有五种方法 xff1a 原子访问 xff0c 临界区 xff0c 信号量 xff0c 事件和互斥量 xff1b 其中原子访问和临界区属于用户模式的同步 xff1b 信号量 xff0c 事件和互斥量属于内核模式的同步 原子访问是通
  • C++进阶—>_beginthreadex和CreateThread的区别和联系

    beginthread 和 CreateThread 的区别 转自 http wenku baidu com view adede4ec4afe04a1b071dea4 html 程序员对于Windows程序中应该用 beginthread
  • idea src下源文件和class编译文件不一致

    今天遇到一个神奇BUG xff0c 一个和elasticsearch没有任何关系的项目 xff0c 报错ES某个包找不到 xff0c 刚开始以为是依赖了父项目的某个包 xff0c 并且本项目主启动类ComponentScan扫描了相关的类进
  • C++进阶—>Win32 多线程的创建方法和基本使用

    Summary From xff1a https software intel com zh cn blogs 2011 12 02 win32 cid 61 sw prccsdn2086 总结Win32提供的创建多线程相关的API接口和基
  • Windows核心编程之多进程概述

    一 进程的概念 进程是是一个正在运行的程序的实例 xff08 飘 xff5e xff5e xff5e xff09 xff0c 是系统分配资源的单位 线程是执行的单位 xff0c 包括内存 xff0c 打开的文件 处理机 外设等 xff0c
  • Windows核心编程之进程间通信

    1 进程与进程通信 进程是装入内存并准备执行的程序 xff0c 每个进程都有私有的虚拟地址空间 xff0c 由代码 数据以及它可利用的系统资源 如文件 管道等 组成 多进程 多线程是Windows操作系统的一个基本特征 Microsoft
  • Windows核心编程之邮槽实现进程间通信

    邮槽是Windows系统提供的一种单向通信的机制 即进程中的一方只能写入或读取数据 xff0c 而另一方则只能读取或写入数据 通过邮槽 xff0c 用户可以实现一对多或跨网络的进程之间的通信 但是 xff0c 邮槽能传输的数据非常小 xff
  • 图像连通域分析

    转自 xff1a https blog csdn net tiandijun article details 51279643 xff0c 转载仅为方便学习 一 前言 二值图像的图像的亮度值只有两个状态 xff1a 黑 0 和白 255 二
  • C++ wchar_t *和char * 互转

    转自 xff1a https blog csdn net lightspear article details 54695123 说道wchar t和char两个类型大家都不会陌生 wchar t xff1a 在windows下是Unico