10

文字列が UTF-16 (1 文字あたり 2 バイト) でエンコードされているファイル形式 (読み取りと書き込みの両方) を処理する必要があります。ASCII テーブルの文字はアプリケーション ドメインでほとんど使用されないため、C++ モデル クラスのすべての文字列は std::string (UTF-8 エンコード) のインスタンスに格納されます。

ライブラリ (STL と Boost で検索しても運が悪かった) またはファイル形式からの読み込み時またはファイル形式への保存時にこの std::string <-> UTF-16 変換を処理するための C/C++ 関数のセット (実際にモデル化されたバイトストリームとして)サロゲートペアの生成/認識とすべてのUnicodeスタッフ(私は確かに専門家ではありません)を含みます...

助言がありますか?ありがとう!

編集:クロスプラットフォーム(Win / Mac)である必要があり、C++ 11を使用できないことを忘れていました。

4

3 に答える 3

15

C++11には次の機能があります。

std::string s = u8"Hello, World!";

// #include <codecvt>
std::wstring_convert<std::codecvt<char16_t,char,std::mbstate_t>,char16_t> convert;

std::u16string u16 = convert.from_bytes(s);
std::string u8 = convert.to_bytes(u16);

しかし、私の知る限り、これまでのところこれを持っている唯一の実装はlibc++です。C ++ 11にはstd::codecvt_utf8_utf16<char16_t>、他のいくつかの実装にもあります。具体的にcodecvt_utf8_utf16は、VS 2010以降で動作します。wchar_tはWindowsでUTF-16を表すために使用されるため、これを使用してUTF-8とWindowsのネイティブエンコーディングを変換できます。


特殊codecvt<char16_t, char, mbstate_t>化はUTF-16とUTF-8のエンコード方式のcodecvt<char32_t, char, mbstate_t>間で変換され、特殊化はUTF-32とUTF-8のエンコード方式の間で変換されます。

                                                                                                                         — [locale.codecvt] 22.4.1.4/3


ああ、そしてstd :: codecvtスペシャライゼーションはデストラクタを保護しており、wstring_convertはデストラクタへのアクセスを必要とするため、本当にアダプタが必要です。

template <class Facet>
class usable_facet : public Facet {
public:
    using Facet::Facet; // inherit constructors
    ~usable_facet() {}

    // workaround for compilers without inheriting constructors:
    // template <class ...Args> usable_facet(Args&& ...args) : Facet(std::forward<Args>(args)...) {}
};

template<typename internT, typename externT, typename stateT> 
using codecvt = usable_facet<std::codecvt<internT, externT, stateT>>;

std::wstring_convert<codecvt<char16_t,char,std::mbstate_t>> convert;
于 2012-06-18T15:46:24.547 に答える
4

Boost.Localeを見ましたか? 特に、このページでは、UTF から UTF への変換を行う方法と、それを IOStreams と統合する方法について説明します。

于 2012-06-18T15:54:00.303 に答える