c++ 如何将std::string写入UTF-8文本文件

6jygbczu  于 2023-02-06  发布在  其他
关注(0)|答案(9)|浏览(292)

我只想用C++在文本文件中写几行简单的代码,但我希望它们用UTF-8编码,最简单的方法是什么?

nsc4cvqm

nsc4cvqm1#

UTF-8影响std::string的唯一方式是size()length()和所有索引都是以字节而不是字符来度量的。
而且,正如sbi指出的,递增std::string提供的迭代器将按字节而不是字符前进,因此它实际上可以指向多字节UTF-8码点的中间,标准库中没有提供支持UTF-8的迭代器,但在'Net上有一些。
如果您还记得这一点,您可以将UTF-8放入std::string,将其写入文件,等等,所有这些都是以通常的方式进行的(我指的是您使用内部没有UTF-8的std::string的方式)。
您可能希望文件以字节顺序标记开始,以便其他程序知道它是UTF-8。

5fjcxozz

5fjcxozz2#

有一个很好的小库可以在c++中使用utf8:utfcpp

a64a0gku

a64a0gku3#

libiconv是一个很棒的库,可以满足我们所有的编码和解码需求。
如果您使用的是Windows,则可以使用WideCharToMultiByte并指定需要UTF8。

tktrz96b

tktrz96b4#

什么是最容易和简单的方法来做到这一点?
在C++中处理utf8最直观也是最简单的方法肯定是用一个直接替代std::string,因为互联网上还没有这样的替代,所以我自己实现了这个功能:
tinyutf8(编辑:现在的Github)。
这个库为std::string(或者std::u32string,如果你愿意的话,因为你迭代的是 * codepoints * 而不是 * char * s)提供了一个非常轻量级的插入式前置。Ity在快速访问和小内存消耗之间成功实现,同时非常健壮。这种对"无效" UTF8序列的健壮性使它(几乎完全)兼容ANSI(0 - 255)。
希望这有帮助!

f3temu5u

f3temu5u5#

如果“简单”指的是ASCII,则不需要进行任何编码,因为ASCII值为127或更小的字符在UTF-8中是相同的。

nue99wik

nue99wik6#

std::wstring text = L"Привет";
QString qstr = QString::fromStdWString(text);
QByteArray byteArray(qstr.toUtf8());    
std::string str_std( byteArray.constData(), byteArray.length());
ajsxfq5m

ajsxfq5m7#

我的偏好是在std::u32string之间转换,并在内部处理代码点,然后在使用github上的these转换迭代器写出文件时转换为utf8。

#include <utf/utf.h>

int main()
{
    using namespace utf;

    u32string u32_text = U"ɦΈ˪˪ʘ";
    // do stuff with string
    // convert to utf8 string
    utf32_to_utf8_iterator<u32string::iterator> pos(u32_text.begin());
    utf32_to_utf8_iterator<u32string::iterator> end(u32_text.end());

    u8string u8_text(pos, end);

    // write out utf8 to file.
    // ...
}
6xfqseft

6xfqseft8#

使用glibmm中的Glib::ustring
它是唯一广泛使用的UTF-8字符串容器(AFAIK),虽然它是基于glyph(而不是byte)的,但它具有与std::string相同的方法签名,因此端口应该是简单的搜索和替换(在将数据加载到ustring之前,只需确保您的数据是有效的UTF-8)。

ru9i0ody

ru9i0ody9#

因为UTF-8是多位字符串,所以你会遇到一些问题,这是一个坏主意/相反,使用普通的Unicode。
因此,根据我的意见,最好是使用普通的ASCII字符文本与一些编码集。需要使用Unicode,如果你使用超过2套不同的符号(语言)在一个单一的。
这是相当罕见的情况。在大多数情况下,两组符号就足够了。对于这种常见的情况,使用ASCII字符,而不是Unicode。
使用像UTF-8这样的多字节字符,你只能得到中国传统,阿拉伯或一些象形文字。这是非常非常罕见的情况!!!
我不认为有很多人需要它。所以永远不要使用UTF-8!!!这是避免强烈的头痛操纵这样的字符串。

相关问题