我只想用C++在文本文件中写几行简单的代码,但我希望它们用UTF-8编码,最简单的方法是什么?
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。
std::string
size()
length()
5fjcxozz2#
有一个很好的小库可以在c++中使用utf8:utfcpp
a64a0gku3#
libiconv是一个很棒的库,可以满足我们所有的编码和解码需求。如果您使用的是Windows,则可以使用WideCharToMultiByte并指定需要UTF8。
tktrz96b4#
什么是最容易和简单的方法来做到这一点?在C++中处理utf8最直观也是最简单的方法肯定是用一个直接替代std::string,因为互联网上还没有这样的替代,所以我自己实现了这个功能:tinyutf8(编辑:现在的Github)。这个库为std::string(或者std::u32string,如果你愿意的话,因为你迭代的是 * codepoints * 而不是 * char * s)提供了一个非常轻量级的插入式前置。Ity在快速访问和小内存消耗之间成功实现,同时非常健壮。这种对"无效" UTF8序列的健壮性使它(几乎完全)兼容ANSI(0 - 255)。希望这有帮助!
std::u32string
f3temu5u5#
如果“简单”指的是ASCII,则不需要进行任何编码,因为ASCII值为127或更小的字符在UTF-8中是相同的。
nue99wik6#
std::wstring text = L"Привет"; QString qstr = QString::fromStdWString(text); QByteArray byteArray(qstr.toUtf8()); std::string str_std( byteArray.constData(), byteArray.length());
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. // ... }
6xfqseft8#
使用glibmm中的Glib::ustring。它是唯一广泛使用的UTF-8字符串容器(AFAIK),虽然它是基于glyph(而不是byte)的,但它具有与std::string相同的方法签名,因此端口应该是简单的搜索和替换(在将数据加载到ustring之前,只需确保您的数据是有效的UTF-8)。
ustring
ru9i0ody9#
因为UTF-8是多位字符串,所以你会遇到一些问题,这是一个坏主意/相反,使用普通的Unicode。因此,根据我的意见,最好是使用普通的ASCII字符文本与一些编码集。需要使用Unicode,如果你使用超过2套不同的符号(语言)在一个单一的。这是相当罕见的情况。在大多数情况下,两组符号就足够了。对于这种常见的情况,使用ASCII字符,而不是Unicode。使用像UTF-8这样的多字节字符,你只能得到中国传统,阿拉伯或一些象形文字。这是非常非常罕见的情况!!!我不认为有很多人需要它。所以永远不要使用UTF-8!!!这是避免强烈的头痛操纵这样的字符串。
9条答案
按热度按时间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。
5fjcxozz2#
有一个很好的小库可以在c++中使用utf8:utfcpp
a64a0gku3#
libiconv是一个很棒的库,可以满足我们所有的编码和解码需求。
如果您使用的是Windows,则可以使用WideCharToMultiByte并指定需要UTF8。
tktrz96b4#
什么是最容易和简单的方法来做到这一点?
在C++中处理utf8最直观也是最简单的方法肯定是用一个直接替代
std::string
,因为互联网上还没有这样的替代,所以我自己实现了这个功能:tinyutf8(编辑:现在的Github)。
这个库为
std::string
(或者std::u32string
,如果你愿意的话,因为你迭代的是 * codepoints * 而不是 * char * s)提供了一个非常轻量级的插入式前置。Ity在快速访问和小内存消耗之间成功实现,同时非常健壮。这种对"无效" UTF8序列的健壮性使它(几乎完全)兼容ANSI(0 - 255)。希望这有帮助!
f3temu5u5#
如果“简单”指的是ASCII,则不需要进行任何编码,因为ASCII值为127或更小的字符在UTF-8中是相同的。
nue99wik6#
ajsxfq5m7#
我的偏好是在std::u32string之间转换,并在内部处理代码点,然后在使用github上的these转换迭代器写出文件时转换为utf8。
6xfqseft8#
使用glibmm中的Glib::ustring。
它是唯一广泛使用的UTF-8字符串容器(AFAIK),虽然它是基于glyph(而不是byte)的,但它具有与
std::string
相同的方法签名,因此端口应该是简单的搜索和替换(在将数据加载到ustring
之前,只需确保您的数据是有效的UTF-8)。ru9i0ody9#
因为UTF-8是多位字符串,所以你会遇到一些问题,这是一个坏主意/相反,使用普通的Unicode。
因此,根据我的意见,最好是使用普通的ASCII字符文本与一些编码集。需要使用Unicode,如果你使用超过2套不同的符号(语言)在一个单一的。
这是相当罕见的情况。在大多数情况下,两组符号就足够了。对于这种常见的情况,使用ASCII字符,而不是Unicode。
使用像UTF-8这样的多字节字符,你只能得到中国传统,阿拉伯或一些象形文字。这是非常非常罕见的情况!!!
我不认为有很多人需要它。所以永远不要使用UTF-8!!!这是避免强烈的头痛操纵这样的字符串。