【问题标题】:Unicode in wxWidgetswxWidgets 中的 Unicode
【发布时间】:2021-08-19 14:07:15
【问题描述】:

我正在使用 Visual Studio 2019 在 C++ wxWidgets 中创建一个计算器应用程序。我创建了一个自定义按钮类,我想将其用于所有数学运算和符号。

如何将按钮的标签设置为 √ 而不是 sqrt?如果我这样做,一个?而是显示符号。我还需要在 wxTextCtrl 上显示这些符号,如果这样做,我在尝试编译时会收到以下错误:(忽略 App.razor,图片不是我的)

我需要将当前字符集从 ASCII 更改为 Unicode 吗?你是怎么做到的?

【问题讨论】:

  • 只是字体问题。您应该使用支持此类字符的字体。
  • 我已将字体从 Lato 更新为 Arial,according to Wikipedia 是一种支持 Unicode 的字体,我收到了同样的错误消息。
  • @GiacomoCatenazzi 这不是字体问题。如果OP在源代码文件中使用"√",那么显然该文件必须保存为Unicode,否则如何保留√字符?这正是错误消息的含义
  • @phuclv 和 iKebab897:不,拥有 unicode 支持与拥有能够显示此类 unicode 字符的字体不同。没有字体可以显示所有分配的 unicode 字符。此外,带有 NOTO 字体的 Google(以显示所有 Unicode 字符)将字符拆分为多种字体。并且:源编码与显示编码无关(过去这个问题更常见,在 unicode 之前)
  • @GiacomoCatenazzi 我知道没有字体支持所有 Unicode 字符。但这里的问题是 OP 在源代码中输入了一个非 ASCII 字符,而 VS 要求将文件保存为 UTF-8 以保留该字符或丢弃所有非 ASCII 字符和像以前一样将文件保存为 ASCII

标签: c++ unicode ascii wxwidgets


【解决方案1】:

对于单个字符,您可以只使用 wxUniChar。您创建一个 wxUniChar,其值为所需字符的 Unicode 代码点的十六进制值。由于平方根字符的 Unicode 码位是 U+221A,因此您可以为该字符创建一个 wxUniChar,如下所示:

wxUniChar c(0x221A);

wxUnichar 可以隐式转换为 wxString,因此(假设 wxWidgets 是在 Unicode 模式下构建的),您可以像使用 wxString 一样使用 wxUniChar 变量。例如,您可以执行以下操作:

control->SetLabel(c);

dc.DrawText(c,0,0);

【讨论】:

    【解决方案2】:

    @New-Pagodi 的答案(抱歉,不知道如何用姓名中的空格标记人)有效,但只需将文件保存为 UTF-8 编码,正如 MSVS 建议的那样,效果会更好解决方案。即使在这种情况下,请注意您仍然需要使用wxString::FromUTF8("√") 或使用setlocale() 将您的语言环境编码显式设置为UTF-8,最近的Windows 版本(最终)支持,在这种情况下,您可以只使用"√", or use wide strings, i.e. L"√"`。

    即您必须两者在文件中具有正确的字节(e2 88 9a 用于 U+221A 的 UTF-8 编码表示)并且在创建 wxString 时使用正确的编码如果您使用的是char* 字符串,请从中获取。默认情况下,此编码在 Windows 下不是 UTF-8,因此仅使用 wxString("√") 不起作用。

    【讨论】:

    • 你把空格删掉,变成一个单词。
    • 我不明白,抱歉,用外行的话来说,我应该怎么做才能在我的解决方案中使用 Unicode 字符?我不熟悉编码和语言环境的工作原理。
    • 另外,如果我想将这些特殊字符存储在数组中怎么办?我喜欢: int ops[10] = { '+', '-', '*', '/', '^' };我应该使用哪种类型来存储诸如 √ 和其他数学符号之类的字符?
    • 我认为您需要了解自己在做什么,这实际上并没有那么复杂:每个char* 字符串都必须与某种编码相关联,才能正确地将其转换为Unicode。现在,这种编码几乎总是应该是 UTF-8。至于单个“字符”,如果您不关心代理(表情符号...),您可以使用wchar_t,或者在最近的 C++ 版本中使用char32_t,或者为它们使用wxUniChar
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-02
    • 2021-06-18
    • 1970-01-01
    相关资源
    最近更新 更多