【问题标题】:C++ with wxWidgets, Unicode vs. ASCII, what's the difference?C++ 与 wxWidgets,Unicode 与 ASCII,有什么区别?
【发布时间】:2011-09-03 16:13:14
【问题描述】:

我有一个 Code::Blocks 10.05 rev 0 和 gcc 4.5.2 Linux/unicode 64bit 和 WxWidgets 版本 2.8.12.0-0
我有一个简单的问题:

#define _TT(x) wxT(x)
string file_procstatus;
file_procstatus.assign("/PATH/TO/FILE");
printf("%s",file_procstatus.c_str());
wxLogVerbose(_TT("%s"),file_procstatus.c_str());

当 wxLogVerbose 变成废话时,Printf 正常输出“/PATH/TO/FILE”。当我想将 std::string 更改为 wxString 时,我必须执行以下操作:

wxString buf;
buf = wxString::From8BitData(file_procstatus.c_str());

有人知道可能出了什么问题,为什么我需要从 8 位数据进行更改?

【问题讨论】:

    标签: c++ unicode ascii wxwidgets


    【解决方案1】:

    这与字符数据在内存中的存储方式有关。使用“字符串”,您可以使用 ASCII 字符集生成 char 类型的字符串,而我假设 _TT 宏扩展为 L“string”,它使用 Unicode 字符集创建 wchar_t 类型的字符串(我相信 Linux 上的 UTF-32)。

    printf 函数需要一个 char 字符串,而我假设 wxLogVerbose 需要一个 wchar_t 字符串。这就是转换需求的来源。 ASCII 每个字符使用一个字节(8 位数据),但 wchar_t 字符串每个字符使用多个字节,因此问题在于字符编码。

    如果您不想调用此转换函数,请执行以下操作:

    wstring file_procstatus = wxT("/PATH/TO/FILE");
    wxLogVerbose(_TT("%s"),file_procstatus.c_str());
    

    【讨论】:

    • 使用 wsString insted of std:string 可能是一个解决方案,但是在使用 OS 函数(以及 STL 函数)时会出现问题,我需要转换所有内容。并且始终使用 _TT(别名对于 wxT) 非常烦人。所以我可能不得不坚持将 std::string 转换为 wxString。 :)
    • @ptrl4me:我认为 wxString 应该可以使用 STL 函数,而在我看来 std::string 使用 OS 函数并不方便。
    【解决方案2】:

    以下文章对 Unicode 和 ASCII 字符集的差异、它们在内存中的存储方式以及字符串函数如何使用它们进行了最佳解释。

    http://allaboutcharactersets.blogspot.in/

    【讨论】:

    • 这篇文章比这个问题的其他答案更能说明什么?
    猜你喜欢
    • 1970-01-01
    • 2011-10-12
    • 2020-10-23
    • 1970-01-01
    • 2015-03-04
    • 1970-01-01
    • 1970-01-01
    • 2010-11-29
    • 2011-02-19
    相关资源
    最近更新 更多