DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: melqui
今日帖子: 33
在线用户: 12
导航: 论坛 -> DELPHI技术 斑竹:liumazi,sephil  
作者:
男 mini_peng (mini_peng) ★☆☆☆☆ -
普通会员
2017/10/20 19:13:34
标题:
请问CBuilder10.2如何使用std::string的函数? 浏览:669
加入我的收藏
楼主: 我之前在ubuntu16.04下写的std::string标准函数,现在想移到CBuilder10.2下来。发现CB默认的宽字符串,跟传统的字符串,不好匹配。网上查了2个字符串(宽字符和std::string)转换函数。似乎不完美(加解密函数不能处理中文只能对英文字符,而在Ubuntu下正常)。

已经将编译器改为ANSI、GNU都尝试过
----------------------------------------------
-
作者:
男 bahamut8348 (leonna) ★☆☆☆☆ -
普通会员
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"");
  }
}
----------------------------------------------
--
作者:
男 wang_80919 (Flying Wang) ★☆☆☆☆ -
普通会员
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
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行62.5毫秒 RSS