10 编码转换问题

news2024/9/21 4:31:51

文章目录

  • 字符编码问题
  • 编码转换问题
    • ANSI转Unicode
    • Unicode转ANSI
    • Utf8转 ANSI
    • utf8 转Unicode
    • ANSI 转UTF-8
    • Unicode 转 UTF-8
  • 全部代码

字符编码问题

在这里插入图片描述

Windows API 函数
MessageBoxA:MessageBox 内部实现,字符串编码(ANSI)转换成了Unicode,在调用MessageboxW
MessageBox:是一个宏定义
MessageBoxA(NULL,"Hello","提示",MB_OK);
MessageBoxW(NULL,L"Hello",L"提示",MB_OK);

编码转换问题

ANSI转Unicode

//ANSI转Unicode
wchar_t* CCharset::AnsiToUnicode(const char* str)
{
	if (m_wstr)//安全
	{
		delete m_wstr;
		m_wstr = NULL;
	}
		
	DWORD dwSize=::MultiByteToWideChar(CP_ACP,0,str,-1,NULL,0);//求宽字符的大小
	m_wstr = new wchar_t[dwSize];
	::MultiByteToWideChar(CP_ACP, 0, str, -1, m_wstr, dwSize);
	return m_wstr;
}

Unicode转ANSI

//Unicode转ANSI
char * CCharset::UnicodeToAnsi(const wchar_t * wstr)
{
	if (m_str)
	{
		delete m_str;
		m_str = NULL;
	}
	DWORD dwSize=WideCharToMultiByte(CP_ACP, 0, wstr, -1,NULL,0,NULL,NULL);
	m_str = new char[dwSize];
	::WideCharToMultiByte(CP_ACP, 0, wstr, -1, m_str, dwSize, NULL, NULL);
	return m_str;
}

Utf8转 ANSI

char * CCharset::Utf8ToAnsi(const char * str)
{
	if (m_wstr)
	{
		delete[] m_wstr;
		m_wstr = NULL;
	}

	if (m_str)
	{
		delete[] m_str;
		m_str = NULL;
	}
	//UTF-8 转Unicode
	m_wstr= Utf8ToUnicode(str);
	//Unicode 转ANSI
	m_str= UnicodeToAnsi(m_wstr);
	return m_str;
}

utf8 转Unicode

wchar_t* CCharset::Utf8ToUnicode(const char * str)
{
	if (m_wstr)
	{
		delete m_wstr;
		m_wstr = NULL;
	}
	DWORD dwSize=MultiByteToWideChar(CP_UTF8, 0, str, -1, NULL, 0);
	m_wstr = new wchar_t[dwSize];
	memset(m_wstr, 0, dwSize*sizeof(wchar_t));//清空内存
	MultiByteToWideChar(CP_UTF8, 0, str, -1, m_wstr, dwSize);
	return m_wstr;
}

ANSI 转UTF-8

char* CCharset::AnsitoUtf8(const char* str)
{
	if (m_wstr)
	{
		delete[] m_wstr;
		m_wstr = NULL;
	}

	if (m_utf8)
	{
		delete[] m_utf8;
		m_utf8 = NULL;
	}

	//Ansi 转Unicode
	m_wstr= AnsiToUnicode(str);
	//Unicode 转UTF-8
	m_utf8=UnicodeToUtf8(m_wstr);

	return m_utf8;
}

Unicode 转 UTF-8

char * CCharset::UnicodeToUtf8(const wchar_t * wstr)
{
	if (m_utf8)
	{
		delete[] m_utf8;
		m_utf8 = NULL;
	}
	DWORD dwSize=WideCharToMultiByte(CP_UTF8, 0, wstr, -1, NULL, 0, NULL, NULL);
	m_utf8 = new char[dwSize];
	memset(m_utf8,0,dwSize);//清空内存
	WideCharToMultiByte(CP_UTF8, 0, wstr, -1, m_utf8, dwSize, NULL, NULL);
	return m_utf8;
}

全部代码

CCharset.h

#pragma once
class CCharset
{

private:
	wchar_t* m_wstr;
	char* m_str;
	char* m_utf8;
public:
	CCharset();
	~CCharset();

	//ANSI转Unicode
	wchar_t* AnsiToUnicode(const char* str);
	//Unicode转ANSI
	char* UnicodeToAnsi(const wchar_t* wstr);
	//UTF8 转ANSI
	char* Utf8ToAnsi(const char* str);
	//ANSI转UTF - 8
	char* AnsitoUtf8(const char* str);
	//Unicode 转 UTF-8
	char* UnicodeToUtf8(const wchar_t* wstr);
	//UTF-8转Unicode
	wchar_t* Utf8ToUnicode(const char* str);

};

CCharset.cpp

#include "pch.h"
#include "CCharset.h"

CCharset::CCharset()
{
	m_wstr = NULL;
	m_str = NULL;
	m_utf8 = NULL;
}


CCharset::~CCharset()
{
	if (m_wstr)
	{
		delete m_wstr;
		m_wstr = NULL;
	}
		
	if (m_str)
	{
		delete m_str;
		m_str = NULL;
	}

	if (m_utf8)
	{
		delete[] m_utf8;
		m_utf8 = NULL;
	}
}

//ANSI转Unicode
wchar_t* CCharset::AnsiToUnicode(const char* str)
{
	if (m_wstr)//安全
	{
		delete[] m_wstr;
		m_wstr = NULL;
	}
		
	DWORD dwSize=::MultiByteToWideChar(CP_ACP,0,str,-1,NULL,0);//求宽字符的大小
	m_wstr = new wchar_t[dwSize];
	::MultiByteToWideChar(CP_ACP, 0, str, -1, m_wstr, dwSize);
	return m_wstr;
}

//Unicode转ANSI
char * CCharset::UnicodeToAnsi(const wchar_t * wstr)
{
	if (m_str)
	{
		delete[] m_str;
		m_str = NULL;
	}
	DWORD dwSize=WideCharToMultiByte(CP_ACP, 0, wstr, -1,NULL,0,NULL,NULL);//求字符的大小
	m_str = new char[dwSize];
	::WideCharToMultiByte(CP_ACP, 0, wstr, -1, m_str, dwSize, NULL, NULL);
	return m_str;
}


char * CCharset::Utf8ToAnsi(const char * str)
{
	if (m_wstr)
	{
		delete[] m_wstr;
		m_wstr = NULL;
	}

	if (m_str)
	{
		delete[] m_str;
		m_str = NULL;
	}
	//UTF-8 转Unicode
	m_wstr= Utf8ToUnicode(str);
	//Unicode 转ANSI
	m_str= UnicodeToAnsi(m_wstr);
	return m_str;
}

char* CCharset::AnsitoUtf8(const char* str)
{
	if (m_wstr)
	{
		delete[] m_wstr;
		m_wstr = NULL;
	}

	if (m_utf8)
	{
		delete[] m_utf8;
		m_utf8 = NULL;
	}

	//Ansi 转Unicode
	m_wstr= AnsiToUnicode(str);
	//Unicode 转UTF-8
	m_utf8=UnicodeToUtf8(m_wstr);

	return m_utf8;
}

//Unicode 转 UTF-8
char * CCharset::UnicodeToUtf8(const wchar_t * wstr)
{
	if (m_utf8)
	{
		delete[] m_utf8;
		m_utf8 = NULL;
	}
	DWORD dwSize=WideCharToMultiByte(CP_UTF8, 0, wstr, -1, NULL, 0, NULL, NULL);
	m_utf8 = new char[dwSize];
	memset(m_utf8,0,dwSize);//清空内存
	WideCharToMultiByte(CP_UTF8, 0, wstr, -1, m_utf8, dwSize, NULL, NULL);
	return m_utf8;
}

//utf8 转Unicode
wchar_t* CCharset::Utf8ToUnicode(const char * str)
{
	if (m_wstr)
	{
		delete m_wstr;
		m_wstr = NULL;
	}
	DWORD dwSize=MultiByteToWideChar(CP_UTF8, 0, str, -1, NULL, 0);
	m_wstr = new wchar_t[dwSize];
	memset(m_wstr, 0, dwSize*sizeof(wchar_t));//清空内存
	MultiByteToWideChar(CP_UTF8, 0, str, -1, m_wstr, dwSize);
	return m_wstr;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/690911.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

助推RASP2.0 领航ADR新赛道 边界无限打造应用安全防护新范式

2023年以来,数字安全一词多次被提及,成为了我们生活和工作中的一项重要课题。近日,由数世咨询、CIO时代联合主办,新基建创新研究院作为智库支持的“第三届数字安全大会”在北京隆重举办,本届大会以“风险驱动”为主题&…

第26章 uView 内置路由使用注意事项

1 uView 内置路由不支持通过“localhost”域名直接获取数据。 在前后分离开发中“axios” 路由支持使用“localhost”域名或IP地址获取后端的数据,所以不管是IIS部署还是后端调试通过“axios” 路由都能获取数据,对于.NetCore的前后端分离开发来说“axio…

python爬虫之Scrapy框架--保存图片(详解)

目录 Scrapy 使用ImagePipeline 保存图片 使用图片管道 具体步骤 安装相关的依赖库 创建Scrapy项目 配置settings.py 定义Item 编写Spider 运行Spider Scrapy 自定义ImagePipeline 自定义图片管道 Scrapy 使用ImagePipeline 保存图片 Scrapy提供了一个 ImagePipelin…

使用原生AJAX请求数据

一、什么是AJAX AJAX英文全称 Asynchronous Javascript And XML(异步的JavaScript和XML),是指一种创建交互式网页应用的网页开发技术,用于浏览器和服务器之间进行数据交互。AJAX在浏览器与Web服务器之间使用异步数据传输&#xf…

【Jetpack】Navigation 导航组件 ③ ( 为 Navigation Graph 页面跳转 action 添加跳转动画 )

文章目录 一、为 Navigation Graph 添加跳转动画1、进入 Navigation Graph 配置的 Design 模式2、选中 action 跳转3、为 action 跳转设置 enterAnim 进入动画4、为 action 跳转设置 exitAnim 退出动画5、通过代码为 action 跳转设置进入 / 退出动画6、执行效果 代码地址 : CS…

DBeaver连接mysql时报错com.mysql.cj.jdbc.Driver的解决方法【修改驱动下载的maven地址和重新下载驱动】

文章目录 说明解决方法1、打开DBeaver点击窗口-->窗口-->首选项-->链接-->点击驱动-->Maven-->添加2、删除已有的驱动3、重新创建mysql链接 说明 网上下载了最新版本的DBeaver软件,但是链接mysql的时候驱动下载失败,所以就报下面错误…

Cisco Secure Client 5.0.03072 (macOS, Linux, Windows iOS, Andrord)

Cisco Secure Client 5.0.03072 (macOS, Linux, Windows & iOS, Andrord) 思科安全客户端(包括 AnyConnect) 请访问原文链接:https://sysin.org/blog/cisco-secure-client-5/,查看最新版。原创作品,转载请保留出…

半小时摸清一个行业:ChatGPT+麦肯锡关键词法

大家好,我是可夫小子,关注AIGC、读书和自媒体。 说实话,在行业分析中「关键词分析法」最早见诸于冯唐,并非是麦肯锡公司的方法论。 冯唐作为麦肯锡前合伙人,讲了快速掌握一个行业的基本方法,一共有三个看似…

ChatGPT最新版多功能批量写作工具揭秘

随着人工智能技术的不断进步,自然语言处理领域也取得了巨大的突破。其中,ChatGPT作为一款强大的多功能批量写作工具,备受关注。它的最新版本将用户体验提升到了一个新的高度。本文将从多个方面详细阐述ChatGPT最新版的功能和优势。 自动摘要功…

进程与线程的区别,特点比较区别与联系

进程与线程的区别、关系 定义关系比较对于系统调度来说:从拥有资源来说:并发性上下文:系统开销使用多线程的主要目的: 定义 进程:进程是程序执行的实例,包括程序计数器和寄存器和变量的当前值 进程依赖于程…

漏洞复现-fastjson1.2.24-RCE

0x00 实验环境 攻击机:Win 10、Win Server2012 R2(公网环境,恶意java文件所在服务器) 靶机也可作为攻击机:Ubuntu18 (公网环境,docker搭建的vulhub靶场)(兼顾反弹shell…

创造与布局:剖析 Java 对象创建过程以及内存布局

目录 前言创建对象过程对象布局普通对象数组对象如何观察 Object 大小对象头组成部分 对象如何定位对象如何分配总结 前言 上下文提及到了类的加载过程,详细介绍了加载类的每个阶段:Loading、Linking、Initialize,在其中也说明了静态变量赋…

【无标题】asdasd

【4】Ubuntu网络图标消失 sudo service network-manager stop ----->停止网络服务 sudo rm /var/lib/NetworkManager/NetworkManager.state ----->删除配置文件 sudo service network-manager start ----->重启网络服务 sudo vim /etc/NetworkManager/NetworkMana…

Linux RPM包安装、卸载和升级(rpm命令)详解

下面讲解一下,如何使用 rpm 命令对 RPM 二进制包进行安装、卸载和升级操作。我们以安装 apache 程序为例。 RPM包默认安装路径 通常情况下,RPM 包采用系统默认的安装路径,所有安装文件会按照类别分散安装到下表所示的目录中。 RPM 包默认安…

Mybatis实现品牌数据的增删改查

项目目录如下图所示。Mapper包用于存储对数据库进行操作的Mapper接口文件,本文中通过注释的方式对sql语句进行编写。pojo包中存放实体类文件,文件中包含Brand对象相关字段的定义以及get、set、toString方法。service包中存放service层文件,调…

最优化方法(基于lingo)之 整数规划问题求解(3/6)

一、实验目的: 1. 掌握分支定界法原理。整数规划求解的分枝定界法,首先确定目标函数的一个初始上下界,然后通过逐步分支使上界减小,下界增大,直到两者相等时,就求出了最优值和最优解。 2. 掌握用数学软件求…

pdf可以转excel格式吗?分享两个快速转换方法给大家!

PDF文档常用于存储和共享信息,但在需要编辑或分析数据时,将PDF转换为Excel格式是一个常见需求。本文将向您介绍两种快速转换PDF为Excel格式的方法,让您轻松解决数据提取难题。无论您是处理大量数据还是需要转换复杂表格,这些方法都…

Ubuntu安装和配置ssh保姆教程

配置ssh常常遇到一些问题,接下来是避免踩坑,快速配置ssh 相信大家在设置ssh时,会碰到"Permission denied, please try again." ⚠️敲黑板: 有可能是密码输入错误 有可能是防火墙未关闭 有可能是连接机器的root用户没…

spring boot使用swagger简明笔记

1、什么是swagger swagger就是一个在你写接口的时候自动帮你生成接口文档的东西&#xff0c;只要你遵循它的规范并写一些接口的说明注解即可。 本文springboot版本&#xff1a;2.5.6 2、引入依赖 <!-- swagger --><dependency><groupId>io.springfox</gr…

【论文阅读】Level-S2fM:神经隐式表面水平集上的SfM

【论文阅读】Level-S2fM&#xff1a;神经隐式表面水平集上的SfM Abstract1. Introduction2. Related Works2.1. Structure from Motion2.2. Neural Implicit Representation for 3D Scene 3. Preliminaries3.1. Neural Implicit Surface Rendering3.2. Ray Sampling and Sphere…