如何将Unicode字符存储在数组中?
Posted
技术标签:
【中文标题】如何将Unicode字符存储在数组中?【英文标题】:How to store Unicode characters in an array? 【发布时间】:2021-08-22 18:48:23 【问题描述】:我正在编写一个 C++ wxWidgets 计算器应用程序,我需要将运算符的字符存储在一个数组中。我有类似int ops[10] = '+', '-', '*', '/', '^';
的东西。如果我还想在所述数组中存储诸如√
、÷
和×
之类的字符,以便它们也可以在wxTextCtrl
和自定义按钮中显示,该怎么办?
【问题讨论】:
wxWidgets 原生使用wxString
,它支持窄字符串和宽字符串。对于窄字符串,它使用默认语言环境,这很危险,所以我建议尽可能使用宽字符串/字符。
【参考方案1】:
这实际上是一个毛茸茸的问题,尽管它起初看起来并不像它。最好的选择是使用 Unicode 控制序列,而不是使用源代码编辑器添加特殊字符。
wxString ops[]=L"+", L"-", L"*", L"\u00F7";
您需要确保 √、÷ 和 × 等字符被正确编译。
您的源文件 (.cpp) 需要以确保编译器生成正确字符的方式存储它们。这比看起来要难,尤其是涉及到 svn、git、windows 和 linux 时。
大多数时候 .cpp 文件是 ANSI 或 8 位编码的,不支持开箱即用的 Unicode 常量。
您可以将源文件保存在 UTF-8 代码页中,以便保留这些字符。但并非所有编译器都接受 UTF-8
最好的方法是使用 Unicode 控制字符对它们进行编码。 wxString div(L"\u00F7");是 ÷ 的字符串。或者在你的情况下可能是 wxChar div('\u00F7')。您必须查找其他特殊字符的 Unicode 控制序列。这样,您的源文件将仅包含 ANSI 字符,并且将被所有编译器接受。当您与不同的操作系统平台交换源文件时,您还将避免代码页问题。
然后你必须确保你编译 wxWidgets 时具有 UNICODE 意识(虽然我认为这是 wx3.x 的默认设置)。然后,如果您的操作系统支持,这些特殊字符应该会显示出来。
阅读 Unicode 控件(***)。在 utf8everywhere.org 中也可以找到很好的输入。文件.editorconfig
也有帮助。
【讨论】:
我按照你的指示写了 wxString ops[10] = L"+", L"-", L"U+00D7", L"U+00F7", L"^", L"U+221A" ;然后我尝试使用 ExpText->SetLabel(ops[2]); 在 wxTextCtrl 上显示乘法符号看看它是否正常工作,而不是显示符号,而是直接显示 U+00D7。 试试 wxString div=L"\u221A"。 U+221A 是在普通文本中写这个的标准方式。在 C 文字中,它可能应该是 \u 而不是 U+ 。请参阅“wxWidgets 中的 Unicode 支持”。 它现在可以工作了,但是我无法将 ops 数组中的 wxString 与 wxTextCtrl 字符串中的单个字符进行比较。我有 this function 出于某种原因仅在 + 符号上返回true
。 Here's the code that I use to call it.
ops->length() 是干什么用的?这会返回数组的大小还是数组中第一个字符串的长度?如果 ops 的定义如上例所示, ops->length() 将取消引用数组中的第一个字符串并为此字符串调用 length
。 (与ops[0].length
相同)。可能不是您想要的 :) 您可以使用现代 C++:``` std::vectorstd::size(ops)
来检索数组的大小。更喜欢使用wchar_t
而不是int
。
wchar_t ops[10] = L'+', L'-', L'*', L'/', L'^', L'√', L'÷', L'×';
这些微不足道地支持您描述的字符,并且微不足道且正确地转换为wxString
s。
【讨论】:
但是保存这个源文件时要注意代码页问题。 @MooingDuck,在跨平台环境下你也需要了解正确的编码... @Igor:通常不会,带有宽字符。它偶尔会出现表情符号,但这并不常见。 @MoolingDuck,我的意思是——在 Windows 和 Linux 中工作时,你需要小心,因为在 Windows (IIUC) 上,std::string 已经是 UNICODE 感知的,而在 Linux 上它是不是。或相反亦然。这就是发明 std::wstring 的原因。其中 IIUC 基于 wchar_t,而 std::string 基于 char *。 Linux 在任何地方都使用 UTF8,包括在std::string
中,而 Windows 使用当前语言环境的代码页。 std::wstring
和 wchar_t
在 Windows 上是 UTF16,在 Linux 上是 UCS32。这些都不应该与这篇文章直接相关,但人们应该意识到这一点。以上是关于如何将Unicode字符存储在数组中?的主要内容,如果未能解决你的问题,请参考以下文章
如何将 unicode 字符串转换为其 unicode 转义?
如何将 Unicode 字符转换为十六进制格式的 Unicode 代码点?