c++ Unicode转UTF-8 & 宽字节转UTF8 & string转wstring & Utf8ToAnsi

2023-11-12

c++后台向网页传数据中文乱码
在这里插入图片描述

unicode的char字符串直接转UTF-8的char
网上找到有unicode转utf-8的代码,但是参数用的是wchar_t的. 不能直接用稍微改造一下
WideCharToMultiByte()函数需要Windows.h头文件

//原本的代码
//unicode转UTF-8
char* UnicodeToUtf8(wchar_t* pwszUnicode)
{
	int len;
	len = WideCharToMultiByte(CP_UTF8, 0, pwszUnicode, -1, NULL, 0, NULL, NULL);
	char* szUtf8 = (char*)malloc((int)len + 1);
	memset(szUtf8, 0, len + 1);
	WideCharToMultiByte(CP_UTF8, 0, pwszUnicode, -1, szUtf8, len, NULL, NULL);
	return szUtf8;
}

直接换成参数char*的

//unicode转UTF-8
char* UnicodeToUtf8(char* str)
{
	// 1. char转wchar_t
	wchar_t* pwszUnicode;
	int iSize;
	iSize = MultiByteToWideChar(CP_ACP, 0, str, -1, NULL, 0);
	pwszUnicode = (wchar_t*)malloc(iSize * sizeof(wchar_t));
	MultiByteToWideChar(CP_ACP, 0, str, -1, pwszUnicode, iSize);
	// 2. wchar_t转u8char
	int len;
	len = WideCharToMultiByte(CP_UTF8, 0, pwszUnicode, -1, NULL, 0, NULL, NULL);
	char* szUtf8 = (char*)malloc((int)len + 1);
	memset(szUtf8, 0, len + 1);
	WideCharToMultiByte(CP_UTF8, 0, pwszUnicode, -1, szUtf8, len, NULL, NULL);
	return szUtf8;
}

这样就行了
在这里插入图片描述
wchar_t 和 char 之间转换
C++中 Unicode 与 UTF-8 编码互转

// 宽字符转UTF8 ,处理字符乱码
std::string EncodeUtf8(std::wstring in)
{
	std::string s(in.length() * 3 + 1, ' ');
	size_t len = ::WideCharToMultiByte(CP_UTF8, 0,
		in.c_str(), in.length(),
		&s[0], s.length(),
		NULL, NULL);
	s.resize(len);
	return s;
}

// UTF8转宽字符 
std::wstring DecodeUtf8(string in)
{
	wstring s(in.length(), (' ')); //"tchar.h"
	size_t len = ::MultiByteToWideChar(CP_UTF8, 0,
		in.c_str(), in.length(),
		&s[0], s.length());
	s.resize(len);
	return s;
}
//wstring转string
std::string ws2s(const std::wstring& ws)
{
	std::string curLocale = setlocale(LC_ALL, NULL);    //"C";
	setlocale(LC_ALL, "chs");
	const wchar_t* _Source = ws.c_str();
	size_t _Dsize = 2 * ws.size() + 1;
	char *_Dest = new char[_Dsize];
	memset(_Dest, 0, _Dsize);
	wcstombs(_Dest, _Source, _Dsize);
	std::string result = _Dest;
	delete[]_Dest;
	setlocale(LC_ALL, curLocale.c_str());
	return result;
}

//string转wstring
std::wstring s2ws(const std::string& s)
{
	setlocale(LC_ALL, "chs");
	const char* _Source = s.c_str();
	size_t _Dsize = s.size() + 1;
	wchar_t *_Dest = new wchar_t[_Dsize];
	wmemset(_Dest, 0, _Dsize);
	mbstowcs(_Dest, _Source, _Dsize);
	std::wstring result = _Dest;
	delete[]_Dest;
	setlocale(LC_ALL, "C");
	return result;
}

//多字节字符项目(ansi)显示网页传来的数据(utf-8)
void Utf8ToAnsi(const char* lpcszStr, char* lpwszStr)
{
	DWORD dwMinSize;
	WCHAR* strTmp;
	dwMinSize = MultiByteToWideChar(CP_UTF8, 0, lpcszStr, -1, NULL, 0);
	strTmp = new WCHAR[dwMinSize];
	MultiByteToWideChar(CP_UTF8, 0, lpcszStr, -1, strTmp, dwMinSize);
	int targetLen = WideCharToMultiByte(CP_ACP, 0, (LPWSTR)strTmp, -1, (char*)lpwszStr, 0, NULL, NULL);
	WideCharToMultiByte(CP_ACP, 0, (LPWSTR)strTmp, -1, (char*)lpwszStr, targetLen, NULL, NULL);
}
//这么写不太好使 改一下
std::string Utf8ToAnsi(const char* lpcszStr)
{
	DWORD dwMinSize;
	WCHAR* strTmp;
	dwMinSize = MultiByteToWideChar(CP_UTF8, 0, lpcszStr, -1, NULL, 0);
	strTmp = new WCHAR[dwMinSize];
	MultiByteToWideChar(CP_UTF8, 0, lpcszStr, -1, strTmp, dwMinSize);
	const int size = sizeof(lpcszStr);
	//std::cout << "sizeof " << sizeof(lpcszStr) << std::endl;
	//std::cout << "strlen " << strlen(lpcszStr) << std::endl;
	char lpwszStr[size];
	int targetLen = WideCharToMultiByte(CP_ACP, 0, (LPWSTR)strTmp, -1, lpwszStr, 0, NULL, NULL);
	WideCharToMultiByte(CP_ACP, 0, (LPWSTR)strTmp, -1, lpwszStr, targetLen, NULL, NULL);
	return lpwszStr;
}

可以了
在这里插入图片描述

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

c++ Unicode转UTF-8 & 宽字节转UTF8 & string转wstring & Utf8ToAnsi 的相关文章

  • WPF DataGrid 多选

    我读过几篇关于这个主题的文章 但很多都是来自 VS 或框架的早期版本 我想做的是从 dataGrid 中选择多行并将这些行返回到绑定的可观察集合中 我尝试创建一个属性 类型 并将其添加到可观察集合中 它适用于单个记录 但代码永远不会触发多个
  • 没有特殊字符的密码验证器

    我是 RegEx 的新手 已经进行了大量搜索 但没有找到任何具体内容 我正在编写一个验证密码字符串的正则表达式 可接受的字符串必须至少具有 4 种字符类型中的 3 种 数字 小写字母 大写字母 特殊字符 我对包含有一个想法 也就是说 如果这
  • 通过引用传递 [C++]、[Qt]

    我写了这样的东西 class Storage public Storage QString key const int value const void add item QString int private QMap
  • std::list 线程push_back、front、pop_front

    std list 线程安全吗 我假设不是这样 所以我添加了自己的同步机制 我认为我有正确的术语 但我仍然遇到问题 每个函数都由单独的线程调用 Thread1 不能等待 它必须尽可能快 std list
  • 如何从 Visual Studio 将视图导航到其控制器?

    问题是解决方案资源管理器上有 29 个项目 而且项目同时具有 ASP NET MVC 和 ASP NET Web 表单结构 在MVC部分中 Controller文件夹中有大约100个子文件夹 每个文件夹至少有3 4个控制器 视图完全位于不同
  • ASP.NET Core 3.1登录后如何获取用户信息

    我试图在登录 ASP NET Core 3 1 后获取用户信息 如姓名 电子邮件 id 等信息 这是我在登录操作中的代码 var claims new List
  • 在 Unity 中实现 Fur with Shells 技术

    我正在尝试在 Unity 中实现皮毛贝壳技术 http developer download nvidia com SDK 10 5 direct3d Source Fur doc FurShellsAndFins pdf Fins 技术被
  • 使用 C# 中的 CsvHelper 将不同文化的 csv 解析为十进制

    C 中 CsvHelper 解析小数的问题 我创建了一个从 byte 而不是文件获取 csv 文件的类 并且它工作正常 public static List
  • 如何获取 EF 中与组合(键/值)列表匹配的记录?

    我有一个数据库表 其中包含每个用户 年份组合的记录 如何使用 EF 和用户 ID 年份组合列表从数据库获取数据 组合示例 UserId Year 1 2015 1 2016 1 2018 12 2016 12 2019 3 2015 91
  • 两个静态变量同名(两个不同的文件),并在任何其他文件中 extern 其中一个

    在一个文件中将变量声明为 static 并在另一个文件中进行 extern 声明 我认为这会在链接时出现错误 因为 extern 变量不会在任何对象中看到 因为在其他文件中声明的变量带有限定符 static 但不知何故 链接器 瑞萨 没有显
  • 为什么这个字符串用AesCryptoServiceProvider第二次解密时不相等?

    我在 C VS2012 NET 4 5 中的文本加密和解密方面遇到问题 具体来说 当我加密并随后解密字符串时 输出与输入不同 然而 奇怪的是 如果我复制加密的输出并将其硬编码为字符串文字 解密就会起作用 以下代码示例说明了该问题 我究竟做错
  • C# xml序列化必填字段

    我需要将一些字段标记为需要写入 XML 文件 但没有成功 我有一个包含约 30 个属性的配置类 这就是为什么我不能像这样封装所有属性 public string SomeProp get return someProp set if som
  • C# 动态/expando 对象的深度/嵌套/递归合并

    我需要在 C 中 合并 2 个动态对象 我在 stackexchange 上找到的所有内容仅涵盖非递归合并 但我正在寻找能够进行递归或深度合并的东西 非常类似于jQuery 的 extend obj1 obj2 http api jquer
  • 如何实例化 ODataQueryOptions

    我有一个工作 简化 ODataController用下面的方法 public class MyTypeController ODataController HttpGet EnableQuery ODataRoute myTypes pub
  • 相当于Linux中的导入库

    在 Windows C 中 当您想要链接 DLL 时 您必须提供导入库 但是在 GNU 构建系统中 当您想要链接 so 文件 相当于 dll 时 您就不需要链接 为什么是这样 是否有等效的 Windows 导入库 注意 我不会谈论在 Win
  • C# 中最小化字符串长度

    我想减少字符串的长度 喜欢 这串 string foo Lorem ipsum dolor sit amet consectetur adipiscing elit Aenean in vehicula nulla Phasellus li
  • DotNetZip:如何提取文件,但忽略zip文件中的路径?

    尝试将文件提取到给定文件夹 忽略 zip 文件中的路径 但似乎没有办法 考虑到其中实现的所有其他好东西 这似乎是一个相当基本的要求 我缺少什么 代码是 using Ionic Zip ZipFile zf Ionic Zip ZipFile
  • 指针和内存范围

    我已经用 C 语言编程有一段时间了 但对 C 语言还是很陌生 有时我对 C 处理内存的方式感到困惑 考虑以下有效的 C 代码片段 const char string void where is this pointer variable l
  • Mono 应用程序在非阻塞套接字发送时冻结

    我在 debian 9 上的 mono 下运行一个服务器应用程序 大约有 1000 2000 个客户端连接 并且应用程序经常冻结 CPU 使用率达到 100 我执行 kill QUIT pid 来获取线程堆栈转储 但它总是卡在这个位置
  • 从 mvc 控制器使用 Web api 控制器操作

    我有两个控制器 一个mvc控制器和一个api控制器 它们都在同一个项目中 HomeController Controller DataController ApiController 如果我想从 HomeController 中使用 Dat

随机推荐