C++ 非 ASCII 字母
C++ Non ASCII letters
我如何遍历非 ASCII 字符的字符串中的字母?
这适用于 Windows!
for (int i = 0; i < text.length(); i++)
{
std::cout << text[i]
}
但是在 linux 如果我这样做:
std::string text = "á";
std::cout << text.length() << std::endl;
它告诉我字符串“á”的长度为 2,而在 windows 上它只有 1
但是对于 ASCII 字母,效果很好!
在你的windows系统的code page中,á是一个单字节字符,即string
中的每个char
确实是一个字符。所以你可以循环打印它们。
在 Linux 上,á 表示为多字节(准确地说是 2 个字节)utf-8 字符 'C3 A1'。这意味着在您的 string
中,á 实际上由 两个 char
组成,分别打印它们(或以任何方式处理它们)会产生无意义的结果。这永远不会发生在 ASCII 字符上,因为每个 ASCII 字符的 utf-8 表示都适合一个字节。
不幸的是,utf-8 并不受 C++ 标准设施的真正支持。只要您只处理整个 string
,既不从中访问单个 char
,也不假定 string
的长度等于 string
中的实际字符数, std::string
很可能会很好。
如果您需要更多的 utf-8 支持,请寻找一个可以实现您需要的好的库。
您可能还想阅读 this 以获得关于不同系统上不同字符集的更详细讨论以及关于 string
与 wstring
的建议。
另请参阅 this 以获取有关如何可移植地处理不同字符编码的信息。
尝试使用 std::wstring。据我所知,标准不支持所使用的编码,因此如果没有处理特定格式的库,我不会将这些内容保存到文件中。某种。它支持多字节字符,因此您可以使用 ASCII 不支持的字母和符号。
#include <iostream>
#include <string>
int main()
{
std::wstring text = L"áéíóú";
for (int i = 0; i < text.length(); i++)
std::wcout << text[i];
std::wcout << text.length() << std::endl;
}
我如何遍历非 ASCII 字符的字符串中的字母? 这适用于 Windows!
for (int i = 0; i < text.length(); i++)
{
std::cout << text[i]
}
但是在 linux 如果我这样做:
std::string text = "á";
std::cout << text.length() << std::endl;
它告诉我字符串“á”的长度为 2,而在 windows 上它只有 1 但是对于 ASCII 字母,效果很好!
在你的windows系统的code page中,á是一个单字节字符,即string
中的每个char
确实是一个字符。所以你可以循环打印它们。
在 Linux 上,á 表示为多字节(准确地说是 2 个字节)utf-8 字符 'C3 A1'。这意味着在您的 string
中,á 实际上由 两个 char
组成,分别打印它们(或以任何方式处理它们)会产生无意义的结果。这永远不会发生在 ASCII 字符上,因为每个 ASCII 字符的 utf-8 表示都适合一个字节。
不幸的是,utf-8 并不受 C++ 标准设施的真正支持。只要您只处理整个 string
,既不从中访问单个 char
,也不假定 string
的长度等于 string
中的实际字符数, std::string
很可能会很好。
如果您需要更多的 utf-8 支持,请寻找一个可以实现您需要的好的库。
您可能还想阅读 this 以获得关于不同系统上不同字符集的更详细讨论以及关于 string
与 wstring
的建议。
另请参阅 this 以获取有关如何可移植地处理不同字符编码的信息。
尝试使用 std::wstring。据我所知,标准不支持所使用的编码,因此如果没有处理特定格式的库,我不会将这些内容保存到文件中。某种。它支持多字节字符,因此您可以使用 ASCII 不支持的字母和符号。
#include <iostream>
#include <string>
int main()
{
std::wstring text = L"áéíóú";
for (int i = 0; i < text.length(); i++)
std::wcout << text[i];
std::wcout << text.length() << std::endl;
}