gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:21:55 26 4
gpt4 key购买 nike

如何在控制台/屏幕上打印这样的字符串:€á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? : 7 但字符串中有 时, 字符后不会打印任何内容。

如果我用 python 编写相同的代码:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

wStr = u"€áa¢cée£"
print u"%s" % wStr

它在同一个控制台上正确打印出字符串。我在 C++ 中缺少什么(好吧,我只是一个菜鸟)?干杯!!


更新 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;
}

首先,它报告 14 作为字符串的长度:€áa¢cée£ : 14 是因为它计算每个字符 2 个字节吗?

我得到的是:

char 1 # ? => €áa¢cée£
char 2 # ? => ??áa¢cée£
char 3 # ? => ?áa¢cée£
char 4 # ? => áa¢cée£
char 5 # ? => ?a¢cée£
char 6 # a => a¢cée£
char 7 # ? => ¢cée£
char 8 # ? => ?cée£
char 9 # c => cée£
char 10 # ? => ée£
char 11 # ? => ?e£
char 12 # e => e£
char 13 # ? => £
char 14 # ? => ?

作为最后一个 cout 输出。所以,我相信实际问题仍然存在。干杯!


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

#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;
}

这就是我得到的结果:

€á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 =>

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

最佳答案

在字符串文字前删除 L。使用 std::string,而不是 std::wstring

UPD:有更好(正确)的解决方案。保留 wchar_t、wstring 和 L,并在程序开头调用 setlocale(LC_ALL,"")

无论如何,您应该在程序的开头调用 setlocale(LC_ALL,"")。这会指示您的程序使用您环境的语言环境,而不是默认的“C”语言环境。你的环境有一个 UTF-8,所以一切都应该工作。

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

但是当你使用 wchar_t 时,一切都崩溃了:gcc 使用 UTF-32,没有应用正确的重新编码(因为语言环境是“C”)并且输出是垃圾。

当您调用 setlocale(LC_ALL,"") 时,程序知道它应该将 UTF-32 重新编码为 UTF-8,然后一切都恢复正常。

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

关于c++ - 如何在 Linux/OS X 上打印 wstring?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6799762/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com