我如何在 Visual Studio 输出窗口中用 C++“计算”这个字符串,现在我们有了 C++14 修订版:(我得到的只是没有符号或问号)。
#include <iostream>
using std::cout;
int main()
{
cout << "Ñá" << ".\n"; //Spanish
cout << "forêt intérêt" << ".\n"; //French
cout << "Gesäß" << ".\n"; //German
cout << "取消波蘇日奇諾" << ".\n"; //Chinesse
cout << "日本人のビット" << ".\n"; //Japanese
cout << "немного русский" << ".\n"; //Russian
cout << "ένα κομμάτι της ελληνικής" << ".\n"; //Greek
cout << "ਯੂਨਾਨੀ ਦੀ ਇੱਕ ਬਿੱਟ" << ".\n"; //Punjabi
cout << "کمی از ایران " << ".\n"; //Persian
cout << "కానీ ఈ ఏమి నరకం ఉంది?" << ".\n"; //Telugu
cout << "Но какво, по дяволите, е това?" << ".\n"; //Bulgarian
cout.flush();
return 0;
}
此外,正确的 Visual Studio 配置是什么来达到正确“cout”这个字符串的目标? (能够显示此字符的字体、unicode 设置等...)。
据我所知:
在项目属性>常规中,您必须将“字符集”设置为“使用unicode字符集”。
在 C/C++>预处理器中,您必须将预处理器定义为 UNICODE。
在工具>选项>环境>字体和颜色的 VisualStudio 菜单中,必须在文本编辑器和输出窗口中使用“Lucida Console”或“Consolas”字体,以获得能够显示字符的字体。
但这还不够。
其中一些建议的重复项在 C++14 中看起来已经过时,在 C++14 中要容易得多。如果您的语言环境设置正确,这应该可以移植。为此,您需要将控制台字体设置为 Lucida Console 或 Consolas,在运行程序之前在控制台中运行 chcp 65001
(或编辑注册表以默认执行此操作),设置字符集源文件的格式为多字节 (UTF-8) 或 Unicode (UTF-16),并将 IDE 的字体设置为 Consolas。
如果这太冗长了,其他人已经发布了有关如何在程序中更改代码页的说明,但您仍然希望将源文件保存为 UTF-8,以便您可以在字符串中使用外来字符常量,并将字体更改为可以显示它们的字体。
#include <cstddef>
#include <iostream>
#include <locale>
using std::cout;
using std::endl;
constexpr char * const texts[] = {
u8"Ñá", //Spanish
u8"forêt intérêt", //French
u8"Gesäß", //German
u8"取消波蘇日奇諾", //Chinese
u8"日本人のビット", //Japanese
u8"немного русский", //Russian
u8"ένα κομμάτι της ελληνικής", // Greek
u8"ਯੂਨਾਨੀ ਦੀ ਇੱਕ ਬਿੱਟ", // Punjabi (wtf?). xD
u8"کمی از ایران ", // Persian (I know it, from 300 movie)
u8"కానీ ఈ ఏమి నరకం ఉంది?", //Telugu (telu-what?)
u8"Но какво, по дяволите, е това?" //Bulgarian
};
constexpr size_t ntexts = sizeof(texts) / sizeof(texts[0]);
int main(void)
{
std::locale::global(std::locale(""));
cout.imbue(std::locale());
for ( size_t i = 0; i < ntexts; ++i )
cout << texts[i] << endl;
return EXIT_SUCCESS;
}
您也可以将它们设为宽字符字符串并使用 wcout
而不是 cout
。在您没有设置 utf-8 语言环境的情况下,以下可能会更好:
#include <cstddef>
#include <iostream>
#include <locale>
using std::wcout;
using std::endl;
constexpr wchar_t * const texts[] = {
L"Ñá", //Spanish
L"forêt intérêt", //French
L"Gesäß", //German
L"取消波蘇日奇諾", //Chinese
L"日本人のビット", //Japanese
L"немного русский", //Russian
L"ένα κομμάτι της ελληνικής", // Greek
L"ਯੂਨਾਨੀ ਦੀ ਇੱਕ ਬਿੱਟ", // Punjabi (wtf?). xD
L"کمی از ایران ", // Persian (I know it, from 300 movie)
L"కానీ ఈ ఏమి నరకం ఉంది?", //Telugu (telu-what?)
L"Но какво, по дяволите, е това?" //Bulgarian
};
constexpr size_t ntexts = sizeof(texts) / sizeof(texts[0]);
int main(void)
{
std::locale::global(std::locale(""));
wcout.imbue(std::locale());
for ( size_t i = 0; i < ntexts; ++i )
wcout << texts[i] << endl;
return EXIT_SUCCESS;
}
在这些示例中,使用当前语言环境应该设置流以在输出时自动使用正确的字符集。第二个示例不太可能假设字符串位于错误的字符集中。