C++でテキストファイルにいくつかの簡単な行を書きたいだけなのですが、UTF-8でエンコードする必要があります。最も簡単で簡単な方法は何ですか?
UTF-8が_std::string
_に影響する唯一の方法は、size()
、length()
、およびすべてのインデックスが文字ではなくバイトで測定されることです。
また、sbiが指摘しているように、_std::string
_によって提供されるイテレータをインクリメントすると、文字ではなくバイト単位で前進するため、実際にはマルチバイトUTF-8コードポイントの中間を指すことができます。標準ライブラリにはUTF-8対応のイテレータはありませんが、「Net。
それを覚えていれば、UTF-8を_std::string
_に入れたり、ファイルに書き込んだりするなど、すべて通常の方法(つまり、UTFなしで_std::string
_を使用する方法を意味します) -8内部)。
他のプログラムがUTF-8であることを認識できるように、バイト順マークでファイルを開始することができます。
C++のutf8で動作する素敵な小さなライブラリがあります: tfcpp
libiconv は、すべてのエンコードおよびデコードのニーズに対応する優れたライブラリです。
Windowsを使用している場合は、 WideCharToMultiByte を使用して、UTF8が必要であることを指定できます。
最も簡単で簡単な方法は何ですか?
C++でのutf8の最も直感的で簡単な処理は、確実に_std::string
_のドロップイン置換を使用することです。インターネットにはまだ1つがないため、私は自分で機能を実装しました。
tinyutf8 (編集:現在Github)。
このライブラリは、_std::string
_(または、charsではなくcodepointsを反復処理するため、_std::u32string
_)の非常に軽量なドロップイン事前配置を提供します。 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());
私の好みは、std :: u32stringとの間で変換し、内部でコードポイントを操作し、次に 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.
// ...
}