将数学符号存储到字符串 c++ 中

Storing math symbols into string c++

本文关键字:字符串 c++ 存储 符号      更新时间:2023-10-16

有没有办法在 c++ 中将数学符号存储到字符串中? 我特别需要联合/交叉符号。

提前感谢!

这个看似简单的问题,其实是多个问题的纠结:

使用什么字符集?

Unicode几乎可以肯定是当今的最佳选择。

使用什么编码?

C++std::stringschar的字符串,但您可以决定这些char如何与字符集中的"字符"相对应。 语言和系统假定的默认表示形式可以是 ASCII,一些随机代码页,如 Latin-1 或 Windows-1252 或 UTF-8。

如果您使用的是 Linux 或 Mac,最好的选择是使用 UTF-8。 如果您使用的是 Windows,则可以选择使用宽字符串 (std::wstring),并使用 UTF-16 作为编码。 但是许多人建议你总是在std::string秒内使用 UTF-8,即使在 Windows 上,只需根据需要从 UTF-16 转换到 UTF-16 即可进行 I/O。

如何在代码中指定字符串文字?

要将 UTF-8 存储在旧版本的 C++(C++11 之前),您可以像这样手动对字符串文本进行编码:

const std::string subset = "xE2x8Ax82";

若要以 C++11 或更高版本存储 UTF-8,请使用u8前缀告诉编译器您希望使用 UTF-8 编码。 您可以使用转义字符:

const std::string subset = u8"u2282";

或者,您可以直接在源代码中输入字符:

const std::string subset = u8"⊂";

我倾向于使用转义版本,以避免担心源文件的编码,以及我使用的所有编辑器、查看器和 IDE 是否都能始终如一地理解源文件编码。

如果您使用的是 Windows 并选择改用 UTF-16,则无论版本C++,都可以在代码中指定宽字符串文本,如下所示:

const std::wstring subset = L"u2282";  // or L"⊂";

如何显示这些字符串?

这非常依赖于系统。

在Mac和Linux上,我怀疑事情通常会起作用。

在 Windows 上的控制台程序中(例如,仅使用<iostreams>printf在命令提示符中显示的程序),您可能会遇到麻烦,因为旧命令提示符没有良好的 Unicode 和字体支持。 (也许这在 Windows 10 上更好?

在Windows上的GUI程序中,您必须确保使用API的"Unicode"版本并为其提供宽字符串。 ("Unicode"在这里用引号引起来,因为Windows API文档经常使用"Unicode"来表示UTF-16编码的宽字符串,这并不完全是Unicode的意思。 因此,如果要使用TextOutMessageBox等 API 来显示字符串,则必须确保执行两件事:(1) 调用 API 的"宽"版本,以及 (2) 传递 UTF-16 编码的字符串。

您可以通过显式调用宽版本(例如,TextOutWMessageBoxW)或通过在项目设置中选择"Unicode"进行编译来解决 (1)。 (您也可以通过定义几个C++预处理器宏来做到这一点,但这个答案已经足够长了。

对于 (2),如果您使用的是std::wstrings,则您已经完成了。 如果您使用的是 UTF-8,则需要创建字符串的宽副本以传递给输出函数。 Windows 提供了制作此类副本的MultiByteToWideChar。 请确保指定CP_UTF8

对于 (2),不要尝试调用 API 函数本身的窄版本(例如,TextOutAMessageBoxA)。 这些会自动将字符串转换为宽字符串,但它们会假设字符串在用户的当前代码页中编码。 如果字符串确实是 UTF-8,那么这些字符将对所有"有趣的"(非 ASCII)字符执行错误操作。

如何从文件、套接字或用户中读取这些字符串?

这是非常特定于系统的,可能值得单独提问。

是的,你可以,如下所示:

std::string unionChar = "∪";
std::string intersectionChar = "∩";

它们只是字符,但不要指望此代码是可移植的。您也可以使用 Unicode,如下所示:

std::string unionChar = u8"u222A";
std::string intersectionChar = u8"u2229";