2

GCC の標準ライブラリ、Boost、またはその他のライブラリは、UTF-8 でエンコードされた (ファイル) ストリームとorの間の変換をサポートするifstreamorの iostream 準拠バージョンを実装していますか?ofstreamstd::vector<wchar_t>std::wstring

4

2 に答える 2

4

C++11 の解決策は、UTF-8 ストリームを適切な形式でラップすることです。wbuffer_convert

#include <fstream>
#include <string>
#include <codecvt>
int main()
{
    std::ifstream utf8file("test.txt"); // if the file holds UTF-8 data
    std::wbuffer_convert<std::codecvt_utf8<wchar_t>> conv(utf8file.rdbuf());
    std::wistream ucsbuf(&conv);
    std::wstring line;
    getline(ucsbuf, line); // then line holds UCS2 or UCS4, depending on the OS
}

これは Visual Studio 2010 および clang++/libc++ では機能しますが、残念ながら GCC では機能しません。

これが広まるまでは、サードパーティのライブラリが最適なソリューションです。

于 2011-10-25T13:20:46.307 に答える
2

あなたの質問はうまくいきません。UTF-8 は特定のエンコーディングwchar_tですが、 はデータ型です。さらに、はシステムの文字セットwchar_tを表すことを標準で意図していますが、これは完全にプラットフォームに任されており、標準は要件を定めていません。

したがって、要求する正しいことは、まず、システムの狭いマルチバイト エンコーディングと、システムのエンコーディングの固定長エンコーディングとの間のワイド文字列への変換です。この機能は、 および によって提供されstd::mbstowcsますstd::wcstombs。これをラップする locale ファセットがどこかにあるかもしれませんが、それはライブラリのちょっとニッチな領域です。

標準で規定されている不透明な「システムのエンコーディング」と、シリアル化されたデータ ソース/シンクで規定されている明確なエンコーディングとの間で変換する場合は、追加のライブラリが必要です。iconv()広く利用可能なPosix をお勧めします。(Windows API には別のアプローチがあり、変換のための特別な関数が用意されています。)

C++11 は、UTF でエンコードされた文字列型とリテラルの明示的なファミリを追加し、おそらくそれらの間でトランスコード機能も追加することで、問題をわずかに軽減します (ただし、実装されている人を見たことはありません)。

この件に関する過去の投稿に対する私の標準的な応答は次のとおりです。Q1Q2Q3。C++11 が完全に利用可能になれば、喜びになるでしょう :-)

于 2011-10-25T12:15:47.007 に答える