4

C++11 では、引用符で囲まれた文字列、Windows ファイル パス、正規表現などの多くの特殊記号を含むリテラルを表すのに非常に便利な生の文字列リテラルが導入されました。

std::string path = R"(C:\teamwork\new_project\project1)"; // no tab nor newline!
std::string quoted = R"("quoted string")";
std::string expression = R"([\w]+[ ]+)";

u8この生の文字列リテラルは、エンコーディング プレフィックス ( 、uU、または)と組み合わせることもできますLが、エンコーディング プレフィックスが指定されていない場合、ファイルのエンコーディングは問題になりますか? では、次のコードがあるとします。

auto message = R"(Pick up a card)";         // raw string 1
auto cards = R"()"; // raw string 2

上記のコードを記述して保存できれば、ソース コードが Unicode としてエンコードされていることは明らかです。

  • ユニコードraw string 1リテラルですか?(ASCII文字のみを使用しますが)つまり、生の文字列はファイルのコード化を継承しますか、ファイルのエンコーディングに関係なく、Unicodeが不要であることをコンパイラが自動検出しますか?
  • Uそれをユニコードリテラルとして扱うためには、エンコーディングプレフィックスが必要raw string 2ですか、それとも、その内容やソースファイルのエンコーディングのために自動的にユニコードになりますか?

ご清聴ありがとうございました。

編集:

上記のコードを ideone.com でテストし、デマングリングされたmessageおよびcards変数の型を出力すると、次のように出力されますchar const*

template<typename T> std::string demangle(T t)
{
    int status;
    char *const name = abi::__cxa_demangle(typeid(T).name(), 0, 0, &status);
    std::string result(name);
    free(name);
    return result;
}

int main()
{
    auto message = R"(Pick up a card)";
    auto cards = R"()";

    std::cout
        << "message type: " << demangle(message) << '\n'
        << "cards type: " << demangle(cards) << '\n';

    return 0;
}

出力:

message type: char const*

cards type: char const*

これは私が思っていたよりもさらに奇妙で、型は(接頭辞wchar_tがなくても) になると確信していました。L

4

2 に答える 2

1

はい、ソースをコンパイルすることさえ重要です。-finput-charset=UTF-16使用している場合は、コンパイルするようなものを使用する必要がありますgcc(VSにも同じことが当てはまります)。

しかし、IHMO には、コードで考慮すべきより基本的なものがあります。たとえば、std::stringコンテナは にcharあり、これは 1 バイトの大きさです。たとえば、UTF-16 を扱っている場合は 2 バイトが必要になるため、(「手動変換」にもかかわらず) 少なくともwchar_t(std::wstring) (または、より安全にするために )char16_tが必要になります。でより安全にC++11)。

したがって、Unicode を使用するには、Unicode 用のコンテナーと、Unicode コード化されたソースを処理するために準備されたコンパイル環境が必要です。

于 2014-01-30T15:59:21.467 に答える
1

生の文字列リテラルは、エスケープの処理方法を変更しますが、エンコーディングの処理方法は変更しません。生の文字列リテラルは、ソース エンコーディングからコンテンツを変換して、適切な実行エンコーディングで文字列を生成します。

文字列リテラルの型と適切な実行エンコーディングは、完全にプレフィックスによって決定されます。Ralone は、常にchar狭い実行エンコーディングで文字列を生成します。ソースが UTF-16 の場合 (およびコンパイラがソース エンコーディングとして UTF-16 をサポートしている場合)、コンパイラは文字列リテラルの内容を UTF-16 からナロー実行エンコーディングに変換します。

于 2014-01-30T15:59:37.993 に答える