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

标签 c++ string math symbols

有没有办法将数学符号存储到 C++ 中的字符串中? 我特别需要并集/交集符号。

提前致谢!

最佳答案

这个看似简单的问题实际上是多个问题的纠结:

What character set to use?

Unicode 几乎肯定是当今最好的选择。

What encoding to use?

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

如果您使用的是 Linux 或 Mac,最好的选择是使用 UTF-8。如果您使用的是 Windows,则可以选择使用宽字符串 ( std::wstring ),并使用 UTF-16 作为编码。但许多人建议您即使在 Windows 上也将 always use UTF-8 写入 std::string s,并根据 I/O 需要简单地从 UTF-16 转换为 UTF-16。

How to specify string literals in the code?

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

const std::string subset = "\xE2\x8A\x82";

要在 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"⊂";

How to display these strings?

这非常依赖于系统。

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

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

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

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

对于(2),如果您使用 std::wstring ,那么您已经完成了。如果您使用 UTF-8,则需要制作字符串的广泛拷贝以传递给输出函数。 Windows 提供 MultiByteToWideChar 用于制作此类拷贝。确保指定 CP_UTF8

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

How to read these strings from a file, a socket, or the user?

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

关于c++ - 将数学符号存储到字符串C++中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44678343/

相关文章:

c++ - 如何设置 PROCESS_SET_QUOTA 来处理?

c++ - 如果程序中没有结构,C++ 代码运行得更快吗

c - 为什么函数会根据容量返回不同的值

java - 使用参数更新字符串

algorithm - "guess the number"任意有理数的游戏?

algorithm - 如何生成 float 的随机分区并且每个部分都有最小值pMin?

algorithm - 3D平面算法中点到线的最小垂直距离

使用 stringstream::str() 更新后,C++ stringstream 无法正常工作

c++ - 项目编译速度太慢(约2000行)

javascript - 用 Greasemonkey 替换网站上的 javascript