C ++ std :: string和UTF-8

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

UTF-8影响std::string的唯一方法是size()length()和所有索引都是以字节为单位,而不是字符。

而且,正如sbi指出的那样,递增由std::string提供的迭代器将逐字节地前进,而不是字符,所以它实际上可以指向多字节UTF-8码点的中间。 标准库中没有提供支持UTF-8的迭代器,但在“networking”上有一些可用的迭代器。

如果你还记得的话,你可以把UTF-8放到std::string ,用通常的方式把它写到一个文件等等(我的意思是你使用一个没有UTF-8的std::string内)。

你可能想用一个字节顺序标记来启动你的文件,这样其他程序就会知道它是UTF-8。

有很好的小图书馆从UTF8的工作: utfcpp

libiconv是我们所有编码和解码需求的优秀库。

如果您使用的是Windows,则可以使用WideCharToMultiByte并指定您需要UTF8。

什么是最简单的方法呢?

C ++中最直观,最简单的处理utf8的方法是使用std::string替代方法 。 由于互联网还缺乏一个,我去自己实现function:

tiny-utf8 (Sourceforge)。

这个库提供了一个非常轻量级的std::string (或std::u32string如果你愿意的话,因为你迭代了代码点而不是char )。 Ity在快速访问和小内存消耗之间成功实现,而且非常强大。 这种对“无效的”UTF8序列的健壮性使其(几乎完全)与ANSI(0-255)兼容。

希望这可以帮助!

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

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

使用glibmm中的Glib :: ustring 。

它是唯一广泛使用的UTF-8string容器(AFAIK)。 虽然基于字形(不是字节),它具有相同的方法签名作为std::string所以端口应该是简单的search和replace(只要确保您的数据是有效的UTF-8加载到ustring )。

至于UTF-8是多字符string,所以你得到一些问题的工作,这是一个坏主意/而是使用普通的Unicode。

所以我认为最好的是使用普通的ASCII字符文本与一些codding设置。 如果您单独使用超过2组不同的符号(语言),则需要使用Unicode。

这是相当罕见的情况。 在大多数情况下足够2套符号。 对于这种常见情况使用ASCII字符,而不是Unicode。

使用UTF-8等多字符字符的效果,您只能得到中国传统,阿拉伯文或一些象形文字。 这是非常非常罕见的情况!

我不认为有很多人需要这个。 所以不要使用UTF-8! 避免操纵这些琴弦的强烈头痛。