|
|
导航: |
论坛 -> DELPHI技术
斑竹:liumazi,sephil |
|
作者: |
|
2017/10/20 19:13:34 |
标题: |
请问CBuilder10.2如何使用std::string的函数? |
浏览:669 |
|
加入我的收藏 |
楼主: |
我之前在ubuntu16.04下写的std::string标准函数,现在想移到CBuilder10.2下来。发现CB默认的宽字符串,跟传统的字符串,不好匹配。网上查了2个字符串(宽字符和std::string)转换函数。似乎不完美(加解密函数不能处理中文只能对英文字符,而在Ubuntu下正常)。
已经将编译器改为ANSI、GNU都尝试过
----------------------------------------------
- |
作者: |
|
2017/10/21 0:11:52 |
1楼: |
一般加解密本身是针对字节操作的,并不是针对字符串。所以只针对ansi字符串就很好理解了。
std::string应该是说的c++标准库里的string类吧?那对应的宽字符串版本是wstring。在string.h里有对应的转换类的。
送你俩函数吧~
const string ws_to_s(const wstring & src) { try { locale sys_locale("");
const wchar_t* data_from = src.c_str(); const wchar_t* data_from_end = src.c_str() + src.size(); const wchar_t* data_from_next = 0;
int wchar_size = 4; char* data_to = new char[(src.size() + 1) * wchar_size]; char* data_to_end = data_to + (src.size() + 1) * wchar_size; char* data_to_next = 0;
memset(data_to, 0, (src.size() + 1) * wchar_size);
typedef codecvt<wchar_t, char, mbstate_t> convert_facet; mbstate_t out_state = { 0 }; auto result = use_facet<convert_facet>(sys_locale).out( out_state, data_from, data_from_end, data_from_next, data_to, data_to_end, data_to_next); if (result == convert_facet::ok) { string dst = data_to; delete[] data_to; return dst; } else { printf("convert error!\n"); delete[] data_to; return string(""); } } catch (...) { return string(""); } }
const wstring s_to_ws(const string & src) { try { locale sys_locale("");
const char* data_from = src.c_str(); const char* data_from_end = src.c_str() + src.size(); const char* data_from_next = 0;
wchar_t* data_to = new wchar_t[src.size() + 1]; wchar_t* data_to_end = data_to + src.size() + 1; wchar_t* data_to_next = 0;
wmemset(data_to, 0, src.size() + 1);
typedef codecvt<wchar_t, char, mbstate_t> convert_facet; mbstate_t in_state = { 0 }; auto result = use_facet<convert_facet>(sys_locale).in( in_state, data_from, data_from_end, data_from_next, data_to, data_to_end, data_to_next); if (result == convert_facet::ok) { wstring dst = data_to; delete[] data_to; return dst; } else { printf("convert error!\n"); delete[] data_to; return wstring(L""); } } catch (...) { return wstring(L""); } }
----------------------------------------------
--
|
作者: |
|
2017/10/21 10:39:25 |
2楼: |
跨平台 通用的 数据加密解密或编码解码的 设计思路 http://www.2pascal.com/forum.php?mod=viewthread&tid=2975&fromuid=4 (出处: 2Pascal-新时代的Pascal)
----------------------------------------------
(C)(P)Flying Wang
|
|