【问题标题】:C++ multilanguage string outputC++ 多语言字符串输出
【发布时间】:2012-09-07 01:16:06
【问题描述】:

我想做的只是输出一行文字:

 #include <iostream>
 #include <string>

 int main(void)
 {
   std::wstring    d=L"string_contains_many_languages_German_Mädchenß_Russian_этотязык_and_ブリザンメント";
   std::wcout<<d<<"\n";

   return 0;
 }

我听说过语言环境。但是,如果我有一个多语言用户怎么办?所以,我不能只坚持一种语言环境。

它在带有 g++ 编译器的 Linux/Ubuntu 和 Windows XP 中都不能正常工作。

我怀疑它可能不仅取决于 C++,还取决于显示此信息的终端和环境。 在 Linux 中,我可以使用命令 touch "ブリザаäЯ"(tilda 终端)创建一个名称为的文件。

我想知道是否至少可以使用 C++ 方法创建一个文件,其名称与我在 d (代码中)之类的字符串中的名称相同

更正:

我也想在 Windows 和 Linux 上做这些操作

【问题讨论】:

  • 在 Linux 上,文件名是不透明的字节序列,没有语义(没有在 API 中作为空终止字符串传递)。在 Windows 上,文件名是 16 位整数的不透明序列,通常假定(但不是必需)构成 UTF-16 代码单元。也许我的this little rant 也有用。
  • 这不是语言环境问题。语言环境包含诸如小数在不同国家/地区的表示方式等方面。您指的是Unicode与ASCII。您要做的就是写出 Unicode 字符,因此 wstring 中的 w 表示宽字符表示。
  • "它在"中都不能正常工作。当你尝试时发生了什么?它应该在这两种环境中都能正常工作。
  • 另外请记住,Windows 控制台窗口不处理 unicode。 程序 可以很好地处理 unicode,但输出窗口不能。

标签: c++ windows linux unicode


【解决方案1】:

在 Windows 上,您应该能够将其写为文字,以 UTF-8 保存文件(因为大多数源代码文件已经保存),然后在输出之前执行 noide 的加宽(字符串)。它会起作用的。

您不想以 UTF-16 格式保存源代码。另一种方法是不将字符串存储在文字中,而是将字符串存储在具有明确定义的编码的单独位置,该编码不会随着在 IDE 中单击按钮而改变。

【讨论】:

    【解决方案2】:

    作为一般规则 wchar_t 在非 Windows 平台上毫无意义。在 Linux 上这工作正常:

    #include <iostream>
    #include <string>
    
    int main(void)
    {
      std::string d = "Mädchenß_этотязык_ブリザンメント";
      std::cout << d << "\n";  
    }
    

    只要您不使用在某处使用 UTF-8 编码以外的东西的古老配置。

    由于多种原因,Windows 上的事情变得更加困难,但这是一种方法:

    #include <iostream>
    #include <string>
    #include <io.h>
    #include <fcntl.h>
    
    int main(void)
    {
      _setmode(_fileno(stdout), _O_U16TEXT);
      std::wstring d = L"Mädchenß_этотязык_ブリザンメント";
      std::wcout << d << "\n";  
    }
    

    【讨论】:

    • 很有趣,感谢 Linux。但我在 Windows 中得到了这个:imm.io/EiIX - 即只有德语正确显示
    • 我忘记了控制台仍然有光栅字体。您需要切换到其中一种 TTF 字体。 Lucida Console 或 Consolas 应该可用。日文将显示为方框,但正确的字符仍然存在(您可以通过从控制台复制粘贴到记事本来显示)。
    • 你的意思是Windows控制台吗?用我的程序分发 +1 应用程序有些问题
    • 是的,我说的是 Windows 控制台,而不是第三方程序。您只需要更改字体设置。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多