SOUI官方论坛

 找回密码
 立即注册
查看: 117|回复: 0

关于SStringW,SStringA,SStringT及std::wstring, std::string之间的转换

[复制链接]
  • TA的每日心情
    奋斗
    2022-7-4 09:45
  • 签到天数: 28 天

    [LV.4]偶尔看看III

    59

    主题

    590

    帖子

    5515

    积分

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    5515

    突出贡献优秀版主

    发表于 2023-5-24 16:35:04 | 显示全部楼层 |阅读模式
    经常有人问SStringX怎么转换成std::string。要搞明白这个问题,首先要知道c++中支持两种字符串表现形式:char * 和wchar_t*
    对应std标准库,就是std::string, std::wstring.
    如果要在string和wstring之间转换,就会涉及到编码方案(字符串的代码页),比如utf-8,utf-16, ansi编码等。
    ansi编码是电脑的本地编码,比如中国用GB-2312, GB-18030,而在台湾就是用的GB-BIG5。
    如果使用本地编码,在大陆能正常显示的字符串,到了台湾就不能显示了。
    因此如果要支持国际化,就需要使用unicode编码,比如utf8,utf16,utf32等。常见的就是utf8。
    utf8使用char*来表示,ansi字符串也使用char*来表示。用户在使用字符串的时候,需要自己知道这个字符串是什么编码。
    前面是一点关于字符串编码的说明。

    还有一个情况需要了解:那就是windows提供的API形式。
    一般来说,凡是涉及到字符串操作的API,windows都提供了两套接口,分别以W, A为后缀。
    比如:OutputDebugStringW, OutputDebugStringA。
    同时windows sdk又提供了一个宏(UNICODE),用来自动识别用户调用的是哪一组API。
    例如:
    #ifdef _UNICODE
    #define OutputDebugString OutputDebugStringW
    #else
    #define OutputDebugString OutputDebugStringA

    #endif
    这样,用户一般情况下直接用OutputDebugString, 而不是手动指定使用哪一个版本。

    现在windows平台编码的程序一般都是unicode编码的。也就是说预编码宏里有UNICODE, _UNICODE这个的定义。
    这标识程序使用常规方式调用windows api都自动调用unicode版本。

    由于程序员经常需要在各种模块,网络之间交互,会有各种场景需要在wstring, string之间转换的需求。
    这就需要使用windows提供的两个api: WideCharToMultiByte, MultiByteToWideChar
    这两个函数有一个非常重要的参数:codePage, 如果是本地编码,就用CP_ACP,如果是utf8编码,就对应CP_UTF8

    SStringW, SStringA和std::wstring, std::string对应。
    SStringT则自动根据当前的UNICODE宏define为SStringW和SStringA。
    SStringW和SStringA之间的转换,SOUI提供了一组宏:S_CW2A, S_CA2W。
    SStringW, SStringA提供了一个方法:SStringX::c_str(),使用该方法可以实现在SStringA和std::string之间的转换。
    c_str()是新版本SOUI提供的方法。老版本有类型转换重载,直接使用(LPCSTR)SStringA就可以了。
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|Archiver|手机版|小黑屋|SOUI官方论坛

    GMT+8, 2024-5-18 14:52

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表