gpt4 book ai didi

C++如何通过忽略每行的第一个字符来读取unicode文件

转载 作者:行者123 更新时间:2023-11-30 03:29:39 25 4
gpt4 key购买 nike

考虑如下包含 Unicode 单词的文件

آب
آباد
آبادان

如果你从右到左阅读,第一个字符是“â ”。

我的第一个要求是逐行读取文件。这很简单。

第二个需求是从每行的第二个字符开始逐行读取文件。结果一定是这样的

ب
باد
بادان

如您所知,有一些解决方案,如 std::substr 可以满足第二个要求,但 Afaik std::substr 不能很好地处理 Unicode 字符。

我需要这样的东西

std::ifstream inFile(file_name);
//Solution for first requirement
std::string line;
if (!std::getline(inFile, line)) {
std::cout << "failed to read file " << file_name << std::endl;
inFile.close();
break;
}
line.erase(line.find_last_not_of("\n\r") + 1);

std::string line2;
//what should be here to meet my second requirement?
//stay on current line
//ignore first character and std::getline(inFile, line2))
line2.erase(line.find_last_not_of("\n\r") + 1);

std::cout<<"Line= "<<line<<std::cout; //should prints آب
std::cout<<"Line2= "<<line<<std::cout; //should prints

inFile.close();

最佳答案

C++11 有 unicode 转换例程,但它们不是很用户友好。但是您可以像这样使用它们来实现更多用户友好的功能:

// This should convert to whatever the system wide character encoding
// is for the platform (UTF-32/Linux - UCS-2/Windows)
std::string ws_to_utf8(std::wstring const& s)
{
std::wstring_convert<std::codecvt_utf8<wchar_t>, wchar_t> cnv;
std::string utf8 = cnv.to_bytes(s);
if(cnv.converted() < s.size())
throw std::runtime_error("incomplete conversion");
return utf8;
}

std::wstring utf8_to_ws(std::string const& utf8)
{
std::wstring_convert<std::codecvt_utf8<wchar_t>, wchar_t> cnv;
std::wstring s = cnv.from_bytes(utf8);
if(cnv.converted() < utf8.size())
throw std::runtime_error("incomplete conversion");
return s;
}

std::string remove_first_char(std::string const& utf8)
{
std::wstring ws = utf8_to_ws(utf8);
ws = ws.substr(1);
return ws_to_utf8(ws);
}

int main()
{
std::string utf8 = u8"آبادان";

std::cout << remove_first_char(utf8) << '\n';
}

输出:

بادان

通过转换为固定代码点 (UCS-2/UTF-32),您可以使用普通字符串函数处理字符串。但有一个警告。 UCS-2 不涵盖所有语言的所有字符,因此您可能必须使用 std::u32string 并编写一个 UTF-8 之间的转换函数> 和 UTF-32

这个答案有一个例子:https://stackoverflow.com/a/43302460/3807729

关于C++如何通过忽略每行的第一个字符来读取unicode文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45565566/

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