【问题标题】:Cannot set window text with Unicode special char无法使用 Unicode 特殊字符设置窗口文本
【发布时间】:2018-08-14 02:47:32
【问题描述】:

我正在尝试使用下面指定的 unicode 特殊字符通过代码设置对话框项文本:

https://www.fileformat.info/info/unicode/char/1f310/index.htm

我一直在尝试调用 SetWindowTextW 函数,将 UTF-16(hex) 值作为参数传递,但没有成功:

GetDlgItem(IDSETTINGS)->SetWindowTextW(_T("\uD83C\uDF10"));

当我构建我的解决方案时,我遇到了两个错误:

错误 C3850: '\uD83C' a universal-character-.name 指定了一个无效字符

错误 C3850: '\uDF10' a universal-character-.name 指定了无效字符

我将不胜感激。

【问题讨论】:

  • 你试过"????"吗?
  • SetWindowTextW_T() 不兼容。将 L"" 与 Unicode 版本的 API 调用一起使用。
  • 您通常可以通过查找MSDN中的错误代码来获得更深入的解释。
  • 您可以为每个窗口单独设置字体。
  • L"\xD83C\xDF10" 也可以使用

标签: c++ c unicode mfc


【解决方案1】:

在这种情况下,编译器错误 C3850 的原因可以在 reference(强调我的)中找到:

表示为通用字符名称的字符必须表示 0-10FFFF 范围内的有效 Unicode 代码点。一个普遍的性格 name 不能包含 Unicode 代理范围 D800-DFFF 中的值, 或编码的代理对。编译器生成代理 自动从有效的代码点配对。

使用 UTF-32 代码点对我有用:

GetDlgItem( IDSETTINGS )->SetWindowTextW( L"\U0001F310" );

如果您确保源文件以 Unicode 编码存储,您也可以将字符直接存储在源文件中,我建议将 UTF-8 与 BOM 一起使用。

GetDlgItem( IDSETTINGS )->SetWindowTextW( L"?" );

请注意,在使用 W (Unicode) API 时,切勿使用 _T()_TEXT() 宏。这些宏根据预处理器变量更改字符串文字的类型,而 Unicode API 总是期望宽字符串,这是通过使用字符串文字的 L 前缀来强制执行的。

【讨论】:

  • 感谢您的努力 :)
  • 值得注意的是,引发了错误C3850,因为有问题的代码试图对代理对进行编码。 “通用字符名称不能包含 Unicode 代理范围、D800-DFFF 或编码的代理对中的值。编译器会自动从有效的代码点生成代理对。”
  • @IInspectable 谢谢,我已经从参考文献中添加了相关引用。
猜你喜欢
  • 1970-01-01
  • 2021-04-14
  • 2015-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-12
  • 1970-01-01
相关资源
最近更新 更多