【问题标题】:MFC, Unicode and DDX_TextMFC、Unicode 和 DDX_Text
【发布时间】:2015-03-23 23:31:25
【问题描述】:

UTF-8 everywhere 提出了一个强有力的理由来完全避开微软的TCHAR_T()LPCTSTR 等等,也将wchar_t 推到一边,勇敢地拥抱一个基于 UTF-8 字符串的世界在狭窄的char 类型上。

这似乎很好,直到我使用 MFC DDX_Text() 宏来获取一个 CString 进出编辑控件。有没有合理的方法:

  • CStringA myString 声明为 UTF-8 字符串(或作为退化大小写的 ASCII/ANSI 字符串)
  • 编译并定义UNICODE
  • 通过适当的转换和/或临时变量将myString 传递到DDX_Text() 的第三个参数,并从关联的编辑控件中获取合理的结果?

如果不是,如果您的应用程序想要使用 UTF-8(或退化情况下的 ASCII/ANSI),您会如何建议通过编辑控件处理字符串输入/输出?

(P.S. 这是由 Visual Studio 2013 鼓励仅使用 Unicode 的 MFC 推动的。鉴于 MFC 应用程序和使用 VS2013 的愿望,这需要定义 UNICODE... 或坚持使用已弃用的做事的方式。)

【问题讨论】:

    标签: c++ unicode utf-8 mfc


    【解决方案1】:

    Windows 在内部使用 UTF-16 作为 UNICODE 标准。因此,您必须遵循这一点并使用在 UNICODE 中定义为 CStringW 的 CString。您还必须使用 _T() 宏。编辑框、列表框等所有 Windows 常用控件也都使用 UNICODE。

    我建议仅将 UTF-8 用于网络内容。

    // UTF8 转换

    CStringA CUtility::UTF16toUTF8(const CStringW& utf16)
    {
        return CW2A(utf16, CP_UTF8);
    }
    
    CStringW CUtility::UTF8toUTF16(const CStringA& utf8)
    {
        return CA2W(utf8, CP_UTF8);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-21
      • 1970-01-01
      相关资源
      最近更新 更多