gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 00:54:39 24 4
gpt4 key购买 nike

有没有办法在 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 中,并根据需要简单地在 UTF-16 之间进行转换以执行 I/O。

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com