Windows下的字符编码转换

简述各个编码概念
  • ANSI:多种编码方式的集合,ANSI并不是一种真正的编码(规定了字符和二进制字节之间的转换关系)
    Windows操作系统下,文件保存默认使用ANSI编码
    在Windows操作系统下,不同的语言对应于ANSI中的不同编码
    如果当前操作系统语言为中文,则ANSI对应于GB2312/GBK编码;
    如果当前操作系统语言为韩文,则ANSI对应于Shift_JIS编码
    如果当前操作系统语言为日文,则ANSI对应于Euc-kr编码

    ANSI兼容ASCII编码

  • UTF-8:一种真正的编码,目前比较通用的一种变长的编码方式
    Linux操作系统下的文件默认保存编码
    适合存储/网络传输等

  • UNCODE:一种真正的编码,不可变长,计算机在内存中使用这种编码操作数据
    UNICODE并不兼容ASCII编码
    由于UNCODE编码的长度固定,因此计算机内存中使用此编码来统计字符串长度,搜索字符很方便
    缺点是由于定长而导致的比较浪费空间,

GB2312GBK的区别:GBK包含GB2312,他们的编码方式相同,只是GBK添入一些GB2312未编码的字符

ANSI,UTF-8,UNICODE字符在Windows下的转换:

convert_code.hpp
调用完不要忘记delete[]掉

//convert_code.hpp
//调用后不要忘记delete[]掉

#pragma once
#include <windows.h>

static const wchar_t* ConvertUtf8ToUnicode(const char* _ansiUtf8)
{
	if (_ansiUtf8 == NULL)
	{
		return L"";
	}
	int len = MultiByteToWideChar(CP_UTF8, 0, _ansiUtf8, -1, NULL, 0);
	wchar_t* wszUnicode = new wchar_t[(size_t)len + 1];
	memset(wszUnicode, 0, ((size_t)len + 1) * sizeof(wchar_t));
	MultiByteToWideChar(CP_UTF8, 0, _ansiUtf8, -1, wszUnicode, len);
	return wszUnicode;
}


static const char* ConvertUnicodeToUtf8(const wchar_t* _szUnicode)
{
	if (_szUnicode == NULL)
	{
		return "";
	}
	int len = WideCharToMultiByte(CP_UTF8, 0, _szUnicode, -1, NULL, 0, NULL, NULL);
	char* szUtf8 = new char[(size_t)len + 1];
	memset(szUtf8, 0, ((size_t)len + 1) * sizeof(char));
	WideCharToMultiByte(CP_UTF8, 0, _szUnicode, -1, szUtf8, len, NULL, NULL);
	return szUtf8;
}


static const wchar_t* ConvertAnsiToUnicode(const char* _szAnsi)
{
	if (_szAnsi == NULL)
	{
		return L"";
	}
	int len = MultiByteToWideChar(CP_ACP, 0, _szAnsi, -1, NULL, 0);
	wchar_t* wszUnicode = new wchar_t[(size_t)len + 1];
	memset(wszUnicode, 0, ((size_t)len + 1) * sizeof(wchar_t));
	MultiByteToWideChar(CP_ACP, 0, _szAnsi, -1, wszUnicode, len);
	return wszUnicode;
}


static const char* ConvertUnicodeToAnsi(const wchar_t* _szUnicode)
{
	if (_szUnicode == NULL)
	{
		return "";
	}
	int len = WideCharToMultiByte(CP_ACP, 0, _szUnicode, -1, NULL, 0, NULL, NULL);
	char* szAnsi = new char[(size_t)len + 1];
	memset(szAnsi, 0, ((size_t)len + 1) * sizeof(char));
	WideCharToMultiByte(CP_ACP, 0, _szUnicode, -1, szAnsi, len, NULL, NULL);
	return szAnsi;
}


static const char* ConvertAnsiToUtf8(const char* _szAnsi)
{
	if (NULL == _szAnsi)
	{
		return "";
	}
	int dwAnsiLen = MultiByteToWideChar(CP_ACP, NULL, _szAnsi, -1, NULL, NULL);
	wchar_t* szTmpUnicode = new wchar_t[(size_t)dwAnsiLen + 1];
	memset(szTmpUnicode, 0, sizeof(wchar_t) * ((size_t)dwAnsiLen + 1));
	MultiByteToWideChar(CP_ACP, NULL, _szAnsi, -1, szTmpUnicode, dwAnsiLen);

	int dwUtf8Len = WideCharToMultiByte(CP_UTF8, 0, szTmpUnicode, -1, NULL, 0, NULL, NULL);
	char* szUtf8 = new char[(size_t)dwUtf8Len + 1];
	memset(szUtf8, 0, sizeof(char) * ((size_t)dwUtf8Len + 1));
	WideCharToMultiByte(CP_UTF8, 0, szTmpUnicode, -1, szUtf8, dwUtf8Len, NULL, NULL);
	delete[] szTmpUnicode;

	return szUtf8;
}


static const char* ConvertUtf8ToAnsi(const char* _szUtf8)
{
	if (NULL == _szUtf8)
	{
		return "";
	}
	int dwAnsiLen = MultiByteToWideChar(CP_UTF8, NULL, _szUtf8, -1, NULL, NULL);
	wchar_t* szTmpUnicode = new wchar_t[(size_t)dwAnsiLen + 1];
	memset(szTmpUnicode, 0, sizeof(wchar_t) * ((size_t)dwAnsiLen + 1));
	MultiByteToWideChar(CP_UTF8, NULL, _szUtf8, -1, szTmpUnicode, dwAnsiLen);

	int dwUtf8Len = WideCharToMultiByte(CP_ACP, 0, szTmpUnicode, -1, NULL, 0, NULL, NULL);
	char* szAnsi = new char[(size_t)dwUtf8Len + 1];
	memset(szAnsi, 0, sizeof(char) * ((size_t)dwUtf8Len + 1));
	WideCharToMultiByte(CP_ACP, 0, szTmpUnicode, -1, szAnsi, dwUtf8Len, NULL, NULL);
	delete[] szTmpUnicode;

	return szAnsi;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
WinHex是一个专门用来对付各种日常紧急情况的小工具。它可以用来检查和修复各种文件、恢复删除文件、硬盘损坏造成的数据丢失等。同时它还可以让你看到其他程序隐藏起来的文件和数据。得到 ZDNetSoftwareLibrary 五星级最高评价,拥有强大的系统效用。   具体来说,WinHex 是一款以通用的 16 进制编辑器为核心,专门用来对付计算机取证、数据恢复、低级数据处理、以及 IT 安全性、各种日常紧急情况的高级工具: 用来检查和修复各种文件、恢复删除文件、硬盘损坏、数码相机卡损坏造成的数据丢失等。功能包括 (依照授权类型):   - 硬盘, 软盘, CD-ROM 和 DVD, ZIP, Smart Media, Compact Flash, 等磁盘编辑器...   - 支持 FAT, NTFS, Ext2/3, ReiserFS, Reiser4, UFS, CDFS, UDF 文件系统   - 支持对磁盘阵列 RAID 系统和动态磁盘的重组、分析和数据恢复   - 多种数据恢复技术   - 可分析 RAW 格式原始数据镜像文件中的完整目录结构,支持分段保存的镜像文件   - 数据解释器, 已知 20 种数据类型   - 使用模板编辑数据结构 (例如: 修复分区表/引导扇区)   - 连接和分割、以奇数偶数字节或字的方式合并、分解文件   - 分析和比较文件   - 搜索和替换功能尤其灵活   - 磁盘克隆 (可在 DOS 环境下使用 X-Ways Replica)   - 驱动器镜像和备份 (可选压缩或分割成 650 MB 的档案)   - 程序接口 (API) 和脚本   - 256 位 AES 加密, 校验和, CRC32, 哈希算法 (MD5, SHA-1, ...)   - 数据擦除功能,可彻底清除存储介质中残留数据   - 可导入剪贴板所有格式数据, 包括 ASCII、16 进制数据   - 可进行 2 进制、16 进制 ASCII, Intel 16 进制, 和 Motorola S 转换   - 字符集: ANSI ASCII, IBM ASCII, EBCDIC, (Unicode)   - 立即窗口切换、打印、生成随机数字   - 支持打开大于 4 GB 的文件,非常快速,容易使用。   - 广泛的联机帮助
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值