web-dev-qa-db-ja.com

UTF-8テキストファイルにstd :: stringを書き込む方法

C++でテキストファイルにいくつかの簡単な行を書きたいだけなのですが、UTF-8でエンコードする必要があります。最も簡単で簡単な方法は何ですか?

57
poiloi

UTF-8が_std::string_に影響する唯一の方法は、size()length()、およびすべてのインデックスが文字ではなくバイトで測定されることです。

また、sbiが指摘しているように、_std::string_によって提供されるイテレータをインクリメントすると、文字ではなくバイト単位で前進するため、実際にはマルチバイトUTF-8コードポイントの中間を指すことができます。標準ライブラリにはUTF-8対応のイテレータはありませんが、「Net。

それを覚えていれば、UTF-8を_std::string_に入れたり、ファイルに書き込んだりするなど、すべて通常の方法(つまり、UTFなしで_std::string_を使用する方法を意味します) -8内部)。

他のプログラムがUTF-8であることを認識できるように、バイト順マークでファイルを開始することができます。

55
Ben Voigt

C++のutf8で動作する素敵な小さなライブラリがあります: tfcpp

24
denys

libiconv は、すべてのエンコードおよびデコードのニーズに対応する優れたライブラリです。

Windowsを使用している場合は、 WideCharToMultiByte を使用して、UTF8が必要であることを指定できます。

10
Brian R. Bondy

最も簡単で簡単な方法は何ですか?

C++でのutf8の最も直感的で簡単な処理は、確実に_std::string_のドロップイン置換を使用することです。インターネットにはまだ1つがないため、私は自分で機能を実装しました。

tinyutf8 (編集:現在Github)。

このライブラリは、_std::string_(または、charsではなくcodepointsを反復処理するため、_std::u32string_)の非常に軽量なドロップイン事前配置を提供します。 Ityは、高速アクセスと小さなメモリ消費量の中間でうまく実装され、非常に堅牢です。 「無効な」UTF8シーケンスに対するこの堅牢性により、ANSI(0-255)と(ほぼ完全に)互換性があります。

お役に立てれば!

9
Jakob Riedle

ASCIIを意味する「単純な」場合、エンコーディングを行う必要はありません。ASCII値が127以下の文字はUTF-8でも同じであるためです。

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

私の好みは、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.
    // ...
}
0
rmawatson