【问题标题】:C++ std::wofstream unicode issue.C++ std::wofstream unicode 问题。
【发布时间】:2015-09-12 14:17:54
【问题描述】:

我使用 VS 2012 编写了这段代码:

std::wofstream logout("my_log.txt", std::ios_base::out | std::ios_base::trunc);
std::locale utf8_locale(locale(), new codecvt_utf8<wchar_t>);
logout.imbue(utf8_locale);

if (!logout.is_open()) 
{
 printf("Cannot open file.\n"); 
 return 1; 
}
else printf("Log file created.\n");

logout << "Client IP            │"<< "Recv time                │"<< "Request               │"<< "Response     "<<endl;
logout << "─────────────────────┼"<< "─────────────────────────┼"<<endl;

在 my_log.txt 文件中,所有 unicode 符号都替换为“?????”。我想创建类似日志文件表的东西。如果我使用像“---”这样的标准 ASCII 符号,它会起作用,并且它们都会直接显示。 我试图改变全局语言环境,但我没有成功。

【问题讨论】:

  • 您确定用于查看文件的编辑器支持 UTF8/处于 unicode 模式吗?
  • 嗯,其实我不确定。我曾尝试使用 MS Word 和记事本打开此文件,但问题仍然存在。
  • 没有 MS 产品支持 UTF8。所有 MS/Windows 都是 UTF16。尝试使用十六进制查看器来查看文件中的真实内容。
  • @RichardCritten 我文件中的所有 unicode 符号都以十六进制格式显示为 3F。

标签: c++ unicode wofstream


【解决方案1】:

这就是为什么我们在字符串文字中只使用 ASCII 的原因。

您的代码很好,但您的字符串文字显然不包含您认为的内容。这可能是由于文本编辑器配置错误或功能不足。

请改用转义序列 (\uXXXX),这样您就知道自己得到了什么。在 2015 年,由 ASCII 字符组成的源代码绝对不会出错。

【讨论】:

    【解决方案2】:

    哦,这真的很有趣。

    wchar_t *s1 = L"\u2502"; // "│"
    wchar_t *s2 = L"\u2500"; // "─"
    wchar_t *s3 = L"\u253C"; // "┼"
    logout << s1<<s2<<s3<<endl;
    

    现在在我的 .txt 文件中,我看到了 unicode 数字。但是我可以在没有 (\uXXXX) 的情况下使用相同的结构

    logout << L" │ ─ ┼"<<endl;
    

    这也有效。

    【讨论】:

    • 建议:wchar_t const s1 = L'\u2502';.
    • 好吧,那些非 ASCII 文字几乎可以肯定不适用于 GCC。它是非便携式的。
    猜你喜欢
    • 2013-02-12
    • 1970-01-01
    • 2016-12-23
    • 1970-01-01
    • 2013-12-18
    • 1970-01-01
    • 1970-01-01
    • 2011-05-02
    • 1970-01-01
    相关资源
    最近更新 更多