gpt4 book ai didi

c++ - 在 C++ 中反转 wstring

转载 作者:太空狗 更新时间:2023-10-29 22:59:24 24 4
gpt4 key购买 nike

我需要反转 wstring。我有这样的代码:

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

int main() {
std::wstring s;
std::getline(std::wcin, s);
for (const auto &i : s) {
std::wcout << (int) i << " ";
}
std::wcout << std::endl;

std::wcout << s << std::endl;

std::reverse(s.begin(), s.end());
std::wcout << s << std::endl;
return 0;
}

ANSI 字符以 1 个字节编码,我可以很容易地反转它们:

echo -n "papa" | ./reverse
112 97 112 97
papa
apap

但是当我输入编码超过 1 个字节的西里尔文本时,我得到这样的输出:

echo -n "папа" | ./reverse
208 191 208 176 208 191 208 176
папа
�пап�

如何正确反转该字符串?

附言我正在使用 OS X。

最佳答案

您的系统 OS X 使用 UTF-8。所以您没有理由使用wstringwchar_t。事实上,这就是困惑的来源!

你看,当你在 OS X 上用 wstring 调用 getline() 时,它根本不会读取宽字符。这些字符确实每个都是四个字节,但它们具有与使用常规“窄”字符串时相同的 0-255 值范围。因此,当您将西里尔字符通过管道传输到您的程序时,您最终会得到一个长度为 8 的 wstring,因为 C++ 不理解 UTF-8,但您的终端可以理解(因此它看起来像四个字符终端,但在 C++ 中为 8)。

您问题的评论者指出这个问题是正确的:How do I reverse a UTF-8 string in place? - 一旦您意识到您根本没有处理宽字符串,这就是您真正需要的。

关于c++ - 在 C++ 中反转 wstring,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36953161/

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