使用 Visual Studio 2015 计算国际字符的 C++ 代码

标签 c++ internationalization visual-studio-2015

<分区>

我如何在 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;
}

在这些示例中,使用当前语言环境应该设置流以在输出时自动使用正确的字符集。第二个示例不太可能假设字符串位于错误的字符集中。

关于使用 Visual Studio 2015 计算国际字符的 C++ 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33404685/

相关文章:

java - super 强大的 Android NDK : get positionPercent to update audio progress seekbar

java - Wicket7 : Internationalization and Database-Access

localization - 语言代码和语言环境代码的良好定义是什么?

visual-studio-2015 - Visual Studio Professional 2015 测试覆盖率

visual-studio - VS2015,变量观察没有断点使用。是否可以?

debugging - 在 Visual Studio 2015 中调试期间缺少局部变量

c++ - 如何清除 Qt 上的 QwtPlot?

c++ - 如何将 QVariant 转换为原生 QtScriptValue(数字、字符串等)

c++ - 传递参数(将 std::string 转换为 LPWSTR 的概率)

php - 没有页面刷新的多语言更改?