Unicode下CString和char *之间的互相转换

2023-11-10

 CString中存储的字符的数据类型为wchar_t类型。

一、CString转换为char *

(1)方法一:使用wcstombs()

#include <iostream>
using namespace std;
#include <atlstr.h>

int main()
{
	CString str = L"liuxijiao计算机网络";
	wchar_t *pWChar = str.GetBuffer(); //获取str的宽字符用数组保存
	str.ReleaseBuffer();

	int nLen = str.GetLength(); //获取str的字符数
	char *pChar = new char[nLen * 2 + 1]; 
	memset(pChar, 0, nLen * 2 + 1);
	int rtnVal = (int)wcstombs(pChar, pWChar, nLen * 2 + 1); //宽字符转换为多字节字符

	cout<<pChar<<endl;

         delete[] pChar;
	return 0;
}

输出结果:

注意到结果没有输出“计算机网络”,那是因为wcstombs()不支持中文。

(2)方法二:使用WideCharToMultiByte();

#include <iostream>
using namespace std;
#include <atlstr.h>

int main()
{
	CString str = L"liuxijiao计算机网络";
	int n = str.GetLength(); //获取str的字符数
	int len = WideCharToMultiByte(CP_ACP, 0, str, n, NULL, 0, NULL, NULL); //获取宽字节字符的大小,大小是按字节计算的
	char *pChar = new char[len + 1]; //以字节为单位
	WideCharToMultiByte(CP_ACP, 0, str, n, pChar, len, NULL, NULL); //宽字节编码转换成多字节编码
	pChar[len + 1] = '\0'; //多字节字符以'\0'结束
	cout<<pChar<<endl;
         delete[] pChar;
	return 0;
}


输出结果:

二、char *转换为CString

(1)方法一:使用_T()宏

	CString str = _T("liuxijiao计算机网络");

(2)方法二:使用API的函数MultiByteToWideChar()

#include <iostream>
using namespace std;
#include <atlstr.h>
#include <stdio.h>
#include <string.h>

int main()
{
	//将char数组转换为wchar_t数组
	char *pChar = "liuxijiao计算机网络";
	int charLen = strlen(pChar); //计算pChar所指向的字符串大小,以字节为单位,一个汉字占两个字节
	int len = MultiByteToWideChar(CP_ACP, 0, pChar, charLen, NULL, 0); //计算多字节字符的大小,按字符计算
	wchar_t *pWChar = new wchar_t[len + 1]; //为宽字节字符数申请空间,
	MultiByteToWideChar(CP_ACP, 0, pChar, charLen, pWChar, len); //多字节编码转换成宽字节编码
	pWChar[len] = '\0';

	//将wchar_t数组转换为CString
	CString str;
	str.Append(pWChar);

	delete[] pChar;
	delete[] pWChar;
	return 0;
}

在str.Append(pWChar);这条语句处设断点,调试运行,可查看到str的内容为"liuxijiao计算机网络"。

(三)方法三:使用A2T()、A2W()

	char *pChar = "liuxijiao计算机网络";
	USES_CONVERSION;
	CString str = A2T(pChar);
	char *pChar = "liuxijiao计算机网络";
	USES_CONVERSION;
	CString str = A2W(pChar);






 

 


 

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

Unicode下CString和char *之间的互相转换 的相关文章

  • Unity3D StartCoroutine 调用一个函数,该函数什么时候返回?

    我知道Unity3D StartCoroutine调用了一个与StartCoroutine在同一线程上运行的函数 但是被调用的函数什么时候返回到原始调用者 我在互联网上查找了一个很好的 Unity3D Coroutine 示例 但找不到完整
  • SL4 AutoCompleteBox 重复筛选结果问题

    我在 AutoCompleteBox 过滤方面遇到问题 它似乎记住了之前的过滤器 例如 我输入 A 它会返回 1 项 我删除 A 并输入 Z 这应该返回 1 项 问题是它返回 A 过滤器加上 Z 的结果 我删除 Z 并输入 S 这会带回 2
  • 为什么opencv videowriter这么慢?

    你好 stackoverflow 社区 我有一个棘手的问题 我需要你的帮助来了解这里发生了什么 我的程序从视频采集卡 Blackmagic 捕获帧 到目前为止 它工作得很好 同时我用 opencv cv imshow 显示捕获的图像 它也工
  • 检查列表是否包含另一个列表。 C#

    编辑 只是说 ContainsAllItem 中的注释解释得最好 很抱歉问这个问题 我知道以前有人问过这个问题 但我只是不明白 好的 所以我想检查一个列表是否包含另一个列表中的所有项目WITHOUT重叠 以及根据类字符串 名称变量 称为项目
  • 切换图片框可见性 C#

    为什么图片框控件的可见性属性在这里不起作用 我最初将它们设置为 false 以便在屏幕加载时它们不可见 但后来我想切换这个 我已完成以下操作 但似乎不起作用 这是一个 Windows 窗体应用程序 private void Action w
  • 如何使用汇编获取BIOS时间?

    我正在从头开始实现一个小型操作系统 用于教育目的 现在 我想使用汇编来获取 BIOS 时间 我对此进行了很多搜索 但找不到任何代码示例来执行此操作 如果有人可以提供任何参考或代码示例或与此相关的任何内容 我将非常感激 See 时钟中断 1a
  • 在 GCC 和 Clang 下,使用 lambda 的简单 RAII 包装器的复制初始化意外失败

    我在创建一个简单的 RAII 包装器时遇到了一个意想不到的问题 更不用说下面代码的逻辑不完整性了 复制构造函数和赋值运算符未删除等 这意味着是一个SSCCE 令我印象深刻的是复制初始化我的包装器与临时 lambda 的结果会导致编译错误 而
  • rand() 播种与 time() 问题

    我很难弄清楚如何使用 rand 并使用 Xcode 用 time 为其播种 我想生成 0 到 1 之间的随机十进制数 该代码为我提供了元素 1 和 2 看似随机的数字 但元素 0 始终在 0 077 左右 有什么想法吗 我的代码是 incl
  • 使用反射获取基类的受保护属性值

    I would like to know if it is possible to access the value of the ConfigurationId property which is located in the base
  • .net Framework (.net 4.0) 中定义 Base 3 数字的类

    我正在寻找一些可以用来定义 3 基数 三进制数 的类 有什么我可以在 net 框架中使用的东西或者我需要写一些东西吗 谢谢你的帮助 您可以使用解析Convert ToInt32 s base http msdn microsoft com
  • Microsoft.Graph - 如何从具有不同用户名的共享邮箱发送?

    我目前正在将使用 SMTP 的服务代码移植到 Office 365 通过 SMTP 我可以使用 发件人 字段在来自共享收件箱的邮件上设置不同的用户名 同时保留共享电子邮箱地址 这似乎无法通过 Office 365 运行 其工艺流程为 客户填
  • 使用scanf()时如何区分整数和字符

    我只是使用该功能scanf 代码如下 scanf d a printf d a 当我输入1时 它会像我想要的那样打印1 但即使我输入 1a 它也会像以前一样打印 1 当用户输入非整数时 例如 2 3 12ab 1 a 我想向用户显示 输入整
  • 更改其他页面的主窗口内容

    在 WPF 应用程序的主窗口中 我有一个 Badged 元素 来自材料设计 这是我的代码
  • 如何不在类中实现接口的功能?

    面试时面试官问了我以下问题 但我不知道这个问题的答案是什么 请帮忙 如果我不想 我必须做什么 在我的类中实现一个函数 在接口中声明为 由我班实施 Edited 我正在使用 NET 和 C 如果有人可以提供 C 示例代码示例 那就太好了 Th
  • 是什么原因导致 Linq 错误:此方法无法转换为存储表达式?

    我有一堆具有相同 select 语句的 Linq to Entity 方法 所以我想我会很聪明 并将其分离到它自己的方法中以减少冗余 但是当我尝试运行代码时 我得到了以下内容错误 该方法不能转化为 商店表达式 这是我创建的方法 public
  • 将 bignum 类型结构转换为人类可读字符串的有效方法是什么?

    我有一点问题 为了增长我的 C 知识 我决定尝试实现一个基本的 bigint 库 bigint 结构的核心将是一个 32 位整数数组 选择它们是因为它们适合寄存器 这将允许我在数字之间进行操作 这些操作将在 64 位整数中溢出 这也将适合寄
  • 在 SQL Server 上执行分页的最佳方式是什么?

    我有一个数据库超过200万记录 我需要执行分页以在我的 Web 应用程序上显示 该应用程序每页必须有 10 条记录DataGrid 我已经尝试使用ROW NUMBER 但是这种方式会选择所有 200 万条记录 然后只得到 10 条记录 我也
  • 是否有任何不使用公共虚拟方法的正当理由? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 是否有任何不使用公共虚拟方法的正当理由 我在某处读到我们应该避免使用公共虚拟方法 但我想向专家确认这是否是有效的声明 对于良好且稳定的 API
  • 在何处将 CFLAG(例如 -std=gnu99)添加到 (Eclipse CDT) 自动工具项目中

    我有一个简单的 Autotools C 项目 不是 C 其框架是由 Eclipse CDT Juno 为我创建的 CFLAG 通过检查 似乎是 g O2 我希望所有生成的 make 文件也具有 std gnu99附加到 CFLAG 因为我使
  • 通过 cmake 链接作为外部项目包含的 opencv 库[重复]

    这个问题在这里已经有答案了 我对 cmake 比较陌生 经过几天的努力无法弄清楚以下事情 我有一个依赖于 opencv 的项目 它本身就是一个 cmake 项目 我想静态链接 opencv 库 我正在做的是我的项目中有一份 opencv 源

随机推荐

  • linux篇【12】:网络套接字<中序>——tcp

    目录 查看TCP网络服务器情况和端口使用情况 netstat nltp 一 TCP套接字接口 1 inet aton 和inet addr一样 换一种方式而已 2 listen 把套接字设置为监听状态 3 服务器获取客户端的连接 accep
  • c++中整形输入逗号_很重要的收集 --- 关于c++的各种输入(包括istream_iterator结合逗号分隔)...

    最近又开始刷题了 在这个过程中 我不断地发现一个问题 就是不同的题目会有不同的输入要求 而如果用c 这么繁复的语言在刷题的时候 有时候光是一个输入就会把所有的时间都消耗得一干二净 因此我在这里设立一篇文章用来记录不同的输入方式 本篇文章采取
  • SpringBoot基本操作(七)——SpringBoot整合Shiro权限管理(完整demo+界面)

    SpringBoot2 0笔记 一 SpringBoot基本操作 环境搭建及项目创建 有demo 二 SpringBoot基本操作 使用IDEA打war包发布及测试 三 SpringBoot基本操作 SpringBoot整合SpringDa
  • 城市级海量数据流畅调度方案(初稿)

    城市级海量数据流畅调度方案 初稿 一 系统约束 1 硬件限制 CPU 显卡 内存 硬盘 最耗费CPU时间的是 视锥体和boundSphere boundBox的求交计算 显卡现在最大的瓶颈是 当渲染批次多时 2000个primitivese
  • 页面中各种标签中链接地址(href src action)的区别

    页面中各种标签中链接地址 href src action 的区别 1 href是a标签的链接 表示点击a标签需要跳转到哪里 例如 a href demo index jsp 跳转到首页 a 2 action是form表单的地址 表示表单需要
  • chrome浏览器 下载网页视频的方法

    有时候 我们在网上浏览到一些制作的非常好视频 但是网页又不提供视频下载 怎么办呢 工具 Chrome浏览器 迅雷 这里我们以Chrome浏览器为例 其他浏览器同理 步骤 1 在视频播放页面 我们在空白处 单击右键出现下列菜单 点击 检查 或
  • L1 L2范式

    正则化 Regularization 机器学习中几乎都可以看到损失函数后面会添加一个额外项 常用的额外项一般有两种 一般英文称作 1 1 norm和 2 2 norm 中文称作L1正则化和L2正则化 或者L1范数和L2范数 L1正则化和L2
  • 高通Vuforia AR SDK CloudReco案例

    1 云端数据库的建立 包括数据库的Accsse Key 其中 Server Access Keys是被用于VWS服务的 主要用来上传图片和管理图片 Client Access Keys被用于APP中图片识别服务而搜索数据库 标志的设置 一般
  • [WolframTones] an experiment in a new kind of music

    WolframTones an experiment in a new kind of music made possible by Mathematica and A New Kind of Science http tones wolf
  • Python如何读写配置文件?

    目录 什么是配置文件 常见的配置文件格式 为什么要使用配置文件 Python如何读写配置文件 什么是配置文件 配置文件是用于存储程序或系统的设置和配置选项的文本文件 它通常以特定的格式编写 以便程序或系统可以读取和解析其中的配置信息 配置文
  • uos桌面专业版下载多架构软件安装包

    文章目录 一 进入文件下载目录 二 下载软件包及其依赖包 三 安装下载好的deb包 一 进入文件下载目录 进入apt缓存目录后 将多余的deb包全部删除 uos uos PC var cache apt archives cd var ca
  • Android开源框架之okhttp

    OKHttp是一款高效的HTTP客户端 支持连接同一地址的链接共享同一个socket 通过连接池来减小响应延迟 还有透明的GZIP压缩 请求缓存等优势 其核心主要有路由 连接协议 拦截器 代理 安全性认证 连接池以及网络适配 拦截器主要是指
  • 编程大杂烩(四)

    编程大杂烩 四 57 Linux常用命令 版权声明 本文为CSDN博主 Demon gu 的原创文章 遵循CC 4 0 BY SA版权协议 转载请附上原文出处链接及本声明 原文链接 https blog csdn net qq 233291
  • Servlet学习——为什么在web容器中servlet对象只有一个?

    以下为本人个人观点 如有错误 望指出 不胜感激 简单来说就是为了节省内存 servlet的设计非常的巧妙 如果我们对每一个用户请求都生成一个对应servlet的对象 第一 由于web服务器的访问量比较大 意味着内存开销会很大 第二 要GC大
  • 全栈之前端

    欢迎关注 全栈工程师修炼指南 公众号 点击 下方卡片 即可关注我哟 设为 星标 每天带你 基础入门 到 进阶实践 再到 放弃学习 花开堪折直须折 莫待无花空折枝 作者主页 https www weiyigeek top 博客 https b
  • Python程序笔记2023004

    文章目录 抛硬币实验 random 模块 最初版本 改进版本 1 改进版本 2 语法分析 1 语法分析 2 语法分析 3 改进版本 3 改进版本 4 代码分析 1 代码分析 2 代码分析 3 代码分析 4 抛硬币实验 random 模块 i
  • 《Mysql实战45讲》网盘链接

    链接 https pan baidu com s 14fq7BzQD4sIBjYeh1sElQw 提取码 1119
  • 2020年Android面试题汇总(初级)

    本博文转载自 https www jianshu com p feb9584b492c 作者 Wocus 1 跨进程通信的几种方式 Intent 比如拨打电话 ContentProvider数据库存储数据 Broadcast广播通信 AID
  • 代码模型 CodeGeeX2-6B 开源,最低6GB显存,性能优于StarCoder

    点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入 以下内容来源于GLM大模型 我们希望每一位程序员 都能在自己机器上跑上一个自己的编程助手 为实现这一目标 我们现将 代码生成模型 CodeGeeX2 6B 开源 同时我们也将对该
  • Unicode下CString和char *之间的互相转换

    CString中存储的字符的数据类型为wchar t类型 一 CString转换为char 1 方法一 使用wcstombs include