有没有办法将数学符号存储到c ++中的字符串中? 我特别需要联合/交叉符号。
提前致谢!
答案 0 :(得分:2)
是的,你可以,如下:
std::string unionChar = "∪";
std::string intersectionChar = "∩";
它们只是字符,但不希望此代码可移植。您也可以使用Unicode,如下所示:
std::string unionChar = u8"\u222A";
std::string intersectionChar = u8"\u2229";
答案 1 :(得分:2)
这个看似简单的问题实际上是一堆多个问题:
使用什么字符集?
现在几乎可以肯定Unicode是最好的选择。
使用什么编码?
C ++ std::strings
是char
s的字符串,但您可以决定这些char
对应于字符集中的“字符”。语言和系统假定的默认表示可以是ASCII,一些随机代码页,如Latin-1或Windows-1252,或UTF-8。
如果您使用的是Linux或Mac,最好的办法是使用UTF-8。如果您使用的是Windows,则可以选择使用宽字符串(std::wstring
),并使用UTF-16作为编码。但是很多人建议您std::string
在const std::string subset = "\xE2\x8A\x82";
甚至在Windows上,只需根据需要转换为UTF-16进行I / O.
如何在代码中指定字符串文字?
要在旧版本的C ++中存储UTF-8(在C ++ 11之前),您可以手动编码字符串文字,如下所示:
u8
要在C ++ 11或更高版本中存储UTF-8,可以使用const std::string subset = u8"\u2282";
前缀告诉编译器您需要UTF-8编码。您可以使用转义字符:
const std::string subset = u8"⊂";
或者您可以直接在源代码中输入字符:
const std::wstring subset = L"\u2282"; // or L"⊂";
我倾向于使用转义版本来避免担心源文件的编码以及我使用的所有编辑器和查看器以及IDE是否都会一致地理解源文件编码。
如果您使用的是Windows并且选择使用UTF-16,则无论C ++版本如何,您都可以在代码中指定宽字符串文字,如下所示:
<iostreams>
如何显示这些字符串?
这与系统有关。
在Mac和Linux上,我怀疑事情通常会起作用。
在Windows上的控制台程序中(例如,仅使用printf
或TextOut
在命令提示符中显示的程序),您可能遇到麻烦,因为旧版命令提示没有良好的Unicode和字体支持。 (也许这在Windows 10上更好?)
在Windows上的GUI程序中,您必须确保使用API的“Unicode”版本并为其提供宽字符串。 (“Unicode”在此引用引号,因为Windows API文档通常使用“Unicode”来表示UTF-16编码的宽字符串,这与Unicode的含义不同。)因此,如果您想使用像{那样的API {1}}或MessageBox
显示您的字符串,您必须确保做两件事:(1)调用API的“宽”版本,以及(2)传递UTF-16编码的字符串。
通过显式调用宽版本(例如,TextOutW
或MessageBoxW
)或通过在项目设置中选择“Unicode”进行编译来解决(1)。 (您也可以通过定义几个C ++预处理器宏来实现,但这个答案已经够长了。)
对于(2),如果您使用的是std::wstring
,那么您已经完成了。如果您使用的是UTF-8,则需要将字符串的宽泛副本传递给输出函数。 Windows提供MultiByteToWideChar
来制作此类副本。请务必指定CP_UTF8
。
对于(2),请不尝试调用API函数本身的窄版本(例如,TextOutA
或MessageBoxA
)。这些将自动将您的字符串转换为宽字符串,但它们是这样做的,假设字符串是在用户的当前代码页中编码的。如果字符串真的是UTF-8,那么对于所有“有趣”(非ASCII)字符,这些都会做错事。
如何从文件,套接字或用户读取这些字符串?
这是系统特定的,可能值得一个单独的问题。