【问题标题】:How Exactly Do I Deal With Japanese Characters in C++?我如何在 C++ 中准确处理日文字符?
【发布时间】:2012-01-22 18:02:58
【问题描述】:

我正在尝试做一些像这样简单的事情:

#include <iostream>
#include <string>
using namespace std;

int main()
{
    wstring nihongo = L"みんなのにほんご";
    wcout << nihongo << endl;
    return 0;
}

但我收到以下错误:

C:\Users\Leonne\Leomedia\MetaDatterTest.cpp|7|error: stray '\201' in program|

C:\Users\Leonne\Leomedia\MetaDatterTest.cpp|7|error: stray '@' in program|

C:\Users\Leonne\Leomedia\MetaDatterTest.cpp||In function 'int main()':|

C:\Users\Leonne\Leomedia\MetaDatterTest.cpp|7|error: converting to execution character set: Illegal byte sequence|

||=== Build finished: 3 errors, 0 warnings ===|

我在一台 Windows 机器上,我正在尝试创建一个尽可能便携的库,它必须能够处理任何类型的字符:俄语、日语、ASCII 等等。

【问题讨论】:

  • 编译器也必须将源文件读取为unicode,不过我不知道这是不是问题。
  • 您的语句中的 L 之前有一个不可见的字形,字符代码为“\x3000”。复制/粘贴此修复:wstring nihongo = L"みんあのにほんご";
  • @Hans:这是一个答案。
  • 从您的评论看来您应该阅读joelonsoftware.com/articles/Unicode.html
  • 嗯,让他的编译器理解文字并让它在西方机器上的控制台或终端窗口中正确呈现需要另外几个答案。我们不知道编译器和操作系统。

标签: c++ locale wstring


【解决方案1】:

Visual Studio 支持unicode 源文件。确保您的 cpp 文件保存为带有 BOM 的 utf16 或 utf8 格式的文件。一旦采用该格式,您的文件将可以正常编译。

【讨论】:

  • 有 BOM?我为此使用 Code::Blocks。但无论如何,什么是“BOM”?
  • @Sergio,这是 unicode 文件的 2 字节标识符。在记事本中打开源文件,然后使用您希望的适当编码“另存为”
  • wcout 有点脑残......基本上它缩小你的 wstring 然后打印它,默认情况下缩小字符只是高字节的印章。查看这篇关于在 Windows 中打印 UTF16 的博客文章blogs.msdn.com/b/michkap/archive/2008/03/18/8306597.aspx
【解决方案2】:

检查这个问题的第一个答案:

std::wstring VS std::string

我对此的回答:

Handling UTF-8 in C++

我相信您会找到问题的答案。字符编码的问题有点令人困惑,没有简单的答案......

【讨论】:

  • 将此“答案”作为评论发布会更合适。不鼓励仅使用 link elsewhere 的答案。
  • 好吧,我不知道。可以看出这是在 SO 上相当普遍的做法。 OT:我经常想知道,当互联网上到处都有这么多答案甚至文章时,为什么人们会在 SO 上问这样的问题......
  • 人们很懒惰,并不总是在good way。传播有关在 SO 上发布实践的信息。
  • 回答评论,这有助于我更好地理解这一点。谢谢你。
  • @outis 我在 SO cmets 的其他地方读到 SO 旨在帮助谷歌找到关于 SO 的答案,而不是要求人们“用谷歌搜索”。现在阅读您的评论,我对 SO 的用途感到困惑。不过开个玩笑;-)
猜你喜欢
  • 2011-02-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-19
  • 2013-11-19
  • 2011-04-07
  • 1970-01-01
  • 2018-07-10
相关资源
最近更新 更多