在C++中反转wstring
Reverse wstring in C++
我需要反转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字节的cyrillic文本时,我会得到这样的输出:
echo -n "папа" | ./reverse
208 191 208 176 208 191 208 176
папа
�пап�
如何正确地反转字符串?
附言:我使用的是OS X.
您的系统OS X使用UTF-8。因此,您没有理由使用wstring
或wchar_t
。事实上,这就是混乱的根源!
您可以看到,当您在OSX上用wstring
调用getline()
时,它根本不会读取宽字符。实际上,每个字符有四个字节,但它们的值范围与使用常规"窄"字符串时的值范围相同,为0-255。因此,当你将西里尔字母管道传输到你的程序时,你会得到一个长度为8的wstring
,因为C++不理解UTF-8,但你的终端可以理解(因此,它在终端中看起来像四个字符,而在C++中是8个)。
一位评论你问题的人正确地指出了这个问题:我如何在适当的位置反转UTF-8字符串?-一旦你意识到你根本不需要处理宽字符串,这就是你真正需要的。
相关文章:
- Ctypes wstring通过引用传递
- 在C++中将变量 wstring 分配给 Char 数组
- 将日语 wstring 转换为 std::string
- 使用 memcpy 将矢量数据复制到 wstring 的正确方法
- -fshort-wchar 和 std::wstring - 分段错误
- 输出 c++ 窗口 wstring 日志在终端中正确
- 从 uint32_t 转换为 wchar_t 并存储在 wstring 中时出现访问冲突
- 如何将std::wstring转换为char const[]
- 将utf16宽std::wstring转换为utf8窄std::string以获得罕见字符时出现问题
- 找不到 std::wstring 中存在的wchar_t
- 将 char* argv[] 转换为 wstring
- 将 std::string 转换为具有特殊字符的 FString (TCHAR / wstring)
- 在 C++ 中将 utf8 wstring 转换为窗口中的字符串
- 使用 ReadProcessMemory() 将未知大小的字符数组或字符串读入 wstring 中
- 从字符的 ASCII 代码点到 wstring
- 将整数附加到 std::wstring 会给出错误
- boost库的哪一部分使cout能够打印wstring以及如何打印?
- 如何将 wstring 转换为 wchar_t*?C++
- 如何从 LPWSTR** 转换为 std::vector<std::wstring>
- 为什么<wstring>使用自定义 wcscmp 和 wmemcmp 比较器对向量进行排序比默认快得多?