如何将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::vector ops="+", "-", "\u00D7"...; for (const auto &j:ops) if (j==query) return true; 返回假; ``` 或者至少使用std::size(ops) 来检索数组的大小。 注意: length 通常用于字符串,而 size 通常用于数组。【参考方案2】:

更喜欢使用wchar_t 而不是int

wchar_t ops[10] = L'+', L'-', L'*', L'/', L'^', L'√', L'÷', L'×';

这些微不足道地支持您描述的字符,并且微不足道且正确地转换为wxStrings。

【讨论】:

但是保存这个源文件时要注意代码页问题。 @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::wstringwchar_t 在 Windows 上是 UTF16,在 Linux 上是 UCS32。这些都不应该与这篇文章直接相关,但人们应该意识到这一点。

以上是关于如何将Unicode字符存储在数组中?的主要内容,如果未能解决你的问题,请参考以下文章

SAP中如何将一个字符串转成UNICODE格式传送?

如何将 unicode 字符串转换为其 unicode 转义?

如何将 Unicode 字符转换为十六进制格式的 Unicode 代码点?

如何以 unicode (BE) 格式将数据存储在 CFDataRef 中?

如何在 MySQL 中存储 unicode?

如何将char类型数组转换为unicode字符串