C++ 如何在Linux/OS X上打印wstring?

C++ 如何在Linux/OS X上打印wstring?,c++,unicode,wstring,C++,Unicode,Wstring,如何在控制台/屏幕上打印这样的字符串:€a、cée?我试过这个: #include <iostream> #include <string> using namespace std; wstring wStr = L"€áa¢cée£"; int main (void) { wcout << wStr << " : " << wStr.length() << endl; return 0; }

如何在控制台/屏幕上打印这样的字符串:
€a、cée
?我试过这个:

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

wstring wStr = L"€áa¢cée£";

int main (void)
{
    wcout << wStr << " : " << wStr.length() << endl;
    return 0;
}
它在同一个控制台上正确地打印出字符串。在C++中我缺少什么(我只是一个NoOB)?干杯


更新1:基于n.m.的建议

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

string wStr = "€áa¢cée£";
char *pStr = 0;

int main (void)
{
    cout << wStr << " : " << wStr.length() << endl;

    pStr = &wStr[0];
    for (unsigned int i = 0; i < wStr.length(); i++) {
        cout << "char "<< i+1 << " # " << *pStr << " => " << pStr << endl;
        pStr++;
    }
    return 0;
}
#include <iostream>
#include <string>

using namespace std;

wchar_t wStr[] = L"€áa¢cée£";
int iStr = sizeof(wStr) / sizeof(wStr[0]);        // length of the string
wchar_t *pStr = 0;

int main (void)
{
    setlocale (LC_ALL,"");
    wcout << wStr << " : " << iStr << endl;

    pStr = &wStr[0];
    for (int i = 0; i < iStr; i++) {
       wcout << *pStr << " => " <<  static_cast<void*>(pStr) << " => " << pStr << endl;
       pStr++;
    }
    return 0;
}
作为最后一个cout输出。所以,我认为,实际问题仍然存在。干杯


更新2:基于n.m.的第二个建议

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

string wStr = "€áa¢cée£";
char *pStr = 0;

int main (void)
{
    cout << wStr << " : " << wStr.length() << endl;

    pStr = &wStr[0];
    for (unsigned int i = 0; i < wStr.length(); i++) {
        cout << "char "<< i+1 << " # " << *pStr << " => " << pStr << endl;
        pStr++;
    }
    return 0;
}
#include <iostream>
#include <string>

using namespace std;

wchar_t wStr[] = L"€áa¢cée£";
int iStr = sizeof(wStr) / sizeof(wStr[0]);        // length of the string
wchar_t *pStr = 0;

int main (void)
{
    setlocale (LC_ALL,"");
    wcout << wStr << " : " << iStr << endl;

    pStr = &wStr[0];
    for (int i = 0; i < iStr; i++) {
       wcout << *pStr << " => " <<  static_cast<void*>(pStr) << " => " << pStr << endl;
       pStr++;
    }
    return 0;
}

为什么在那里报告为
9
而不是
8
?或者这就是我应该期待的?干杯

L
放在字符串文本之前。使用
std::string
,而不是
std::wstring

UPD:有一个更好(正确)的解决方案。保留wchar\u t、wstring和L,并在程序开始时调用
setlocale(LC\u ALL,”)

无论如何,您应该在程序开始时调用
setlocale(LC_ALL,”)
。这将指示程序使用环境的区域设置,而不是默认的“C”区域设置。您的环境有一个UTF-8,所以一切都应该正常工作

在不调用setlocale(LC_ALL,“”)的情况下,程序使用UTF-8序列,而没有“意识到”它们是UTF-8。如果终端上打印了正确的UTF-8序列,它将被解释为UTF-8,一切看起来都很好。如果您使用
string
char
,就会发生这种情况:gcc使用UTF-8作为字符串的默认编码,ostream会愉快地打印它们,而不应用任何转换。它认为它有一个ASCII字符序列

但是当您使用
wchar\u t
时,一切都会中断:gcc使用UTF-32,没有应用正确的重新编码(因为区域设置是“C”),并且输出是垃圾

当您调用
setlocale(LC_ALL,“”)
时,程序知道它应该将UTF-32重新编码为UTF-8,并且一切都很好


这一切都假设我们只想使用UTF-8。使用任意区域设置和编码超出了本答案的范围。

源代码文件的编码是什么?ASCII?可能重复:@selalerer:“源文件的编码”-如python中的
#-*-编码:utf-8-*-
?如何在C++中知道或设置?我只是用vim来写脚本。干杯@Mac每个源文件都只是一个文本文件。每个文本文件都有一些编码,它可以是基于ASCII表(其中每个字符都是一个字节)或UTF-8或UTF-16等的东西。。。现在,每个文本编辑器都支持保存您选择的编码文件。如何在vim中执行此操作@selalerer:就是这样:
uniTest.cpp:UTF-8 Unicode c程序文本
。如果不是的话,我会很惊讶。VIM被以同样的方式用于每一件事情,而Python工作但C++不使用。你还有什么东西不见了吗?干杯哇!这确实有效。这让我问了另一个问题:
wstring
(因此,我认为也是
wchar\t
)实际上是为了什么?干杯
wchar\u t
是一种模糊不清的类型,它“大到足以容纳系统字符集中的任何字符”,但这完全取决于您的平台如何处理它。通常,您必须使用
mbstowcs
/
wcstombs
函数,或
printf
中的
%Ls
等将其与环境进行接口,以获取我对该主题的一点咆哮,或显式Unicode字符串。@n.m.:嗯,我现在不太确定它是否真的有效:如果我尝试这样的方法:
cout@Kerrek SB:谢谢你的链接。在任何平台/OS上都支持
C++0x
?干杯GCC4.3及以上版本以及MSVS2010都支持C++0x。不知道其他编译器。。。
€áa¢cée£ : 9
€ => 0x1000010e8 => €áa¢cée£
á => 0x1000010ec => áa¢cée£
a => 0x1000010f0 => a¢cée£
¢ => 0x1000010f4 => ¢cée£
c => 0x1000010f8 => cée£
é => 0x1000010fc => ée£
e => 0x100001100 => e£
£ => 0x100001104 => £
 => 0x100001108 =>