优化C++ utf8,gbk,unicode编码间的转换函数

好久没写博客了,不是太忙,是太懒了。。。

最近都在重构公司项目上的代码,然后就发现有部分函数的运行方式可以优化。这些函数的运行的运行方式都是先new出一堆内存,使用,最后delete掉。我就想,可不可以通过静态局部变量来重复使用已经new了的动态内存,以达到优化代码的运行的目的?然后我就用visual studio 2017进行了测试,下面是我的测试代码:

#include <random>
#include <new>
#include <chrono>
#include <iostream>
#include <vector>
#include <string>

int main()
{
	std::default_random_engine dre;
	std::uniform_int_distribution<unsigned> uid;
	std::vector<unsigned> vec_data_length;
	std::chrono::milliseconds used_time;
	std::string test_string = "";
	std::chrono::steady_clock::time_point begin_time_point = std::chrono::steady_clock::now();

	for (size_t loop_times = 0; loop_times < 2000 * 2000; loop_times++)
	{
		vec_data_length.push_back(uid(dre) % 10000);
	}

	begin_time_point = std::chron
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用C++实现UTF-8和GBK转换的示例代码,支持跨平台: ```c++ #include <iostream> #include <string> #include <codecvt> #include <locale> #ifdef _WIN32 #include <Windows.h> #endif std::wstring utf8_to_wstring(const std::string& str) { std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>> converter; return converter.from_bytes(str); } std::string wstring_to_utf8(const std::wstring& wstr) { std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>> converter; return converter.to_bytes(wstr); } std::wstring gbk_to_wstring(const std::string& str) { #ifdef _WIN32 int len = MultiByteToWideChar(CP_ACP, 0, str.c_str(), -1, NULL, 0); wchar_t* buf = new wchar_t[len]; MultiByteToWideChar(CP_ACP, 0, str.c_str(), -1, buf, len); std::wstring wstr(buf); delete[] buf; #else std::wstring_convert<std::codecvt_byname<wchar_t, char, std::mbstate_t>> converter(new std::locale("zh_CN.GBK")); std::wstring wstr = converter.from_bytes(str); #endif return wstr; } std::string wstring_to_gbk(const std::wstring& wstr) { #ifdef _WIN32 int len = WideCharToMultiByte(CP_ACP, 0, wstr.c_str(), -1, NULL, 0, NULL, NULL); char* buf = new char[len]; WideCharToMultiByte(CP_ACP, 0, wstr.c_str(), -1, buf, len, NULL, NULL); std::string str(buf); delete[] buf; #else std::wstring_convert<std::codecvt_byname<wchar_t, char, std::mbstate_t>> converter(new std::locale("zh_CN.GBK")); std::string str = converter.to_bytes(wstr); #endif return str; } int main() { std::string utf8_str = u8"你好,世界!"; std::wstring wstr1 = utf8_to_wstring(utf8_str); std::string gbk_str = "\xC4\xE3\xBA\xC3\xA3\xAC\xCA\xC0\xBD\xE7\xA1\xA3"; std::wstring wstr2 = gbk_to_wstring(gbk_str); std::string utf8_str2 = wstring_to_utf8(wstr2); std::string gbk_str2 = wstring_to_gbk(wstr1); std::cout << utf8_str << " => " << wstr1 << " => " << utf8_str2 << std::endl; std::cout << gbk_str << " => " << wstr2 << " => " << gbk_str2 << std::endl; return 0; } ``` 此代码使用了C++11的`std::codecvt`和`std::wstring_convert`来进行字符编码转换。在Windows平台上,还使用了`MultiByteToWideChar`和`WideCharToMultiByte`函数来进行GBKUnicode转换。代码中使用了`#ifdef _WIN32`来判断是否为Windows平台,从而使用不同的实现。对于其他平台,可以使用相应的库来进行GBKUnicode转换。 示例代码中使用了两个函数进行编码转换: - `utf8_to_wstring`: 将UTF-8编码的字符串转换Unicode字符串(`std::wstring`)。 - `gbk_to_wstring`: 将GBK编码的字符串转换Unicode字符串(`std::wstring`)。 还提供了两个函数进行反向转换: - `wstring_to_utf8`: 将Unicode字符串(`std::wstring`)转换为UTF-8编码的字符串。 - `wstring_to_gbk`: 将Unicode字符串(`std::wstring`)转换GBK编码的字符串。 可以根据实际需要选择相应的函数进行编码转换。在实际使用时,应确保所使用的编译器和库支持UTF-8和GBK编码

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值