我只想使用C++将几行简单的文本写入文本文件,但我希望它们以UTF-8编码。最简单和简便的方法是什么?
唯一影响 std::string
的 UTF-8 方式是其 size()
、length()
和所有索引都是按字节而非字符计量的。
另外,正如 sbi 指出的那样,递增 std::string
提供的迭代器将按字节而非字符向前移动,因此它实际上可以指向多字节的 UTF-8 代码点中间。标准库中没有提供 UTF-8 意识的迭代器,但在互联网上有一些可用的迭代器。
如果您记得这一点,就可以以通常的方式(也就是不使用内部UTF-8的std::string
的方式)将UTF-8放入std::string
,将其写入文件等。
您可能希望在文件开头加上字节顺序标记,以便其他程序知道它是UTF-8编码。
libiconv 是一个非常出色的库,适合我们所有编码和解码需求。
如果你正在使用Windows系统,可以使用WideCharToMultiByte函数,并指定要使用UTF8编码。
std::wstring text = L"Привет";
QString qstr = QString::fromStdWString(text);
QByteArray byteArray(qstr.toUtf8());
std::string str_std( byteArray.constData(), byteArray.length());
这是唯一广泛使用的UTF-8字符串容器(AFAIK)。虽然基于字符(不是字节),但它具有与std::string
相同的方法签名,因此端口应该是简单的搜索和替换(只需确保在将数据加载到ustring
之前,您的数据是有效的UTF-8)。
glibmm
、gtkmm
和所有依赖项目(包括 InkScape)中,这是一个广泛使用且经过充分测试的 UTF8 字符串类。为什么不值得一提呢? - underscore_d我的偏好是将字符串转换为std::u32string并在内部处理代码点,然后使用我在github上发布的这些转换迭代器将其转换为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.
// ...
}
UTF-8 是一种多字节字符字符串,因此在使用时会遇到一些问题,这是一个不好的想法。相反,应使用普通的 Unicode。
所以我的意见是最好使用普通的 ASCII 字符文本与一些编码集。如果您在单个文本中使用了两个以上不同符号(语言)的集合,则需要使用 Unicode。
这是相当罕见的情况。在大多数情况下,2 个符号集就足够了。对于这种常见情况,请使用 ASCII 字符而不是 Unicode。
使用 UTF-8 等多字节字符的影响仅限于中国传统、阿拉伯或某些象形文字。这是非常非常罕见的情况!!!
我认为没有很多人需要这样做。因此,永远不要使用 UTF-8!!!这将避免操纵此类字符串带来的强烈头痛。