char16_t打印问题

14

最近我在将一个Windows应用程序移植到Linux时遇到了问题,因为这些平台之间的大小差异。我尝试使用编译器开关,但打印这些字符时出现了问题(我推测GCC 认为所有都是32位)。

所以我的问题是:有没有什么好方法可以(w)cout ? 我之所以问是因为它不能工作,我被迫将其强制转换为:

cout << (wchar_t) c;

看起来不是什么大问题,但它让我感到烦恼。


1
你到底想做什么?你的输出(终端?)是否需要2或4字节字符?如果是文本处理且你的终端需要UTF8,也许最好将数据流转换为UTF8并发出普通字符。 - Kerrek SB
1
@Let_Me_Be - Windows(就像Java一样)并没有违反任何标准,因为在设计这些系统时16位是标准。你不能因为Unicode标准之后改变了而责怪它们! - Bo Persson
1
@Bo Java不能在逻辑上违反C++标准,因为它是Java。C++的Windows实现可以这样做。另外,旧版本的Windows没有违反标准,因为它们使用16位UCS-2编码(这是完全可以的)。 - Šimon Tóth
2
@Let_Me_Be - 我认为这是关于Unicode标准的,因为你不能轻易地“破坏”不涉及wchar_t大小或编码的C++标准。 - Bo Persson
9
C++11 无法打印 char16_t 和 char32_t 真的很尴尬,我们迫切需要 u16cout 和 u32cout。 - Ricky65
显示剩余10条评论
1个回答

5

尝试一下这个:

#include <locale>
#include <codecvt>
#include <string>
#include <iostream>

int main()
{
    std::wstring_convert<std::codecvt_utf8_utf16<wchar_t> > myconv;
    std::wstring ws(L"Your UTF-16 text");
    std::string bs = myconv.to_bytes(ws);
    std::cout << bs << '\n';
}

15
所以您的意思是没有标准函数可以打印char16_t吗?我的意思是不需要转换...这很奇怪,尤其是考虑到他们花了宇宙年龄的一半来完成c++0x修订。 - NoSenseEtAl
3
我们在等待你设计、测试、实施、获得现场经验、提出建议,然后推动该提案通过标准化流程。我们在忙于做其他事情。 - Howard Hinnant
5
哦,热烈的争论......就像我说的那样,这不是核心语言特性,有点悲哀但也有趣,因为你无法打印其中一种内置类型。Boost库是否具有用于打印char16_t的内置函数? - NoSenseEtAl
4
是的,如果gcc#include <codecvt>能够正常工作,那就太好了 ;) - Paweł Prażak

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接