21

関数c32rtombおよびmbrtoc32from <cuchar>/<uchar.h>は、C Unicode TR (ドラフト) で、UTF-32 1と「マルチバイト文字」の間の変換を実行するものとして説明されています。

(...)sがヌル ポインタでない場合、c32rtomb関数は (シフト シーケンスを含む) で指定されたワイド文字に対応するマルチバイト文字を表すために必要なバイト数を決定し、c32 そのマルチバイト文字表現を配列に格納します。最初の要素は によって指されsます。(...)

この「マルチバイト文字表現」とは何ですか? 私は実際に次のプログラムの動作に興味があります:

#include <cassert>
#include <cuchar>
#include <string>

int main() {
    std::u32string u32 = U"this is a wide string";
    std::string narrow  = "this is a wide string";
    std::string converted(1000, '\0');
    char* ptr = &converted[0];
    std::mbstate_t state {};
    for(auto u : u32) {
        ptr += std::c32rtomb(ptr, u, &state);
    }
    converted.resize(ptr - &converted[0]);
    assert(converted == narrow);
}

その中のアサーションは1を保持することが保証されていますか?


1__STDC_UTF_32__定義された仮定の下で作業する。

4

3 に答える 3

10

アサーションが真であることを保証するにはc32rtomb()、少なくとも文字列で実際に使用される文字に関しては、使用されるマルチバイト エンコーディングが文字列リテラルに使用されるエンコーディングと同じである必要があります。

C99 7.11.1.1/2setlocale()は、カテゴリLC_CTYPEが文字処理関数とマルチバイトおよびワイド文字関数の動作に影響を与えることを指定します。効果が使用されるマルチバイトおよびワイド文字エンコーディングを設定することであるという明示的な確認はありませんが、それが意図です。

したがって、 で使用されるc32rtomb()マルチバイト エンコーディングは、デフォルトの "C" ロケールのマルチバイト エンコーディングです。

C++11 2.14.3/2 は、実行エンコーディング、ワイド実行エンコーディング、UTF-16、および UTF-32 が、対応する文字および文字列リテラルに使用されることを指定します。したがってstd::string narrow、実行エンコーディングを使用してその文字列を表します。

この文字列の "C" ロケール エンコーディングは、この文字列の実行エンコーディングと同じですか?

C99 7.11.1.1/3 では、「C」ロケールが C 翻訳の「最小限の環境」を提供することが指定されています。このような環境には、文字セットだけでなく、使用される特定の文字コードも含まれます。したがって、これは、「C」ロケールが翻訳に必要な文字 (つまり、基本文字セット) をサポートする必要があるだけでなく、「C」ロケールの文字も同じ文字コードを使用する必要があることを意味すると思います。

文字列リテラルのすべての文字は基本文字セットのメンバーであるため、char32_t表現を"C" ロケール表現に変換すると、コンパイラが文字列リテラルcharに対して生成するのと同じ値のシーケンスが生成される必要があります。char主張は真でなければなりません。

基本文字セットを超えるものは、実行エンコーディングと「C」ロケールの間で互換性のある方法でサポートされているという提案は見当たりません。そのため、文字列リテラルで基本文字セット以外の文字を使用した場合、アサーションが成り立つことを保証します。実行文字セットと "C" ロケールの両方に存在する拡張文字を規定しても、表現が互いに一致する必要はありません。

于 2012-10-27T00:08:35.807 に答える
5

質問にリンクされているTRは言う

最大でMB_CUR_MAXバイトが格納されます。

これは(C99で)次のように定義されています

size_t現在のロケールで指定された拡張文字セットのマルチバイト文字の最大バイト数である型の正の整数式

これは、TR の意図が、現在インストールされている C ロケールで定義されているマルチバイト文字を生成することであったことを示す十分な証拠だと思いen_US.utf8ますzh_CN.gb18030

于 2012-10-24T12:32:18.090 に答える