3

配列で 3 バイトの Unicode UTF-8 文字を扱うのに問題があります。それらがchar配列にある場合、複数文字の文字定数と暗黙的な定数変換の警告が表示されますが、wchar_t配列を使用すると、wcoutは何も返しません。プロジェクトの性質上、文字列ではなく配列でなければなりません。以下は、私がやろうとしてきたことの例です。

#include <iostream>
#include <string>
using namespace std;
int main()
{
    wchar_t testing[40];
    testing[0] = L'\u0B95';
    testing[1] = L'\u0BA3';
    testing[2] = L'\u0B82';
    testing[3] = L'\0';
    wcout << testing[0] << endl;
    return 0;
}

助言がありますか?私はOSXで作業しています。

4

1 に答える 1

4

'\u0B95'3 バイトが必要なため、複数文字リテラルと見なされます。複数文字リテラルには、型intと実装定義の値があります。(実際には、これを行うのに gcc が正しいとは思いません)

Lリテラルの前に接頭辞を置くと、型があり、実装定義の値があります (基本実行ワイド文字セットの実装定義スーパーセットである実行ワイド文字セットwchar_tの値にマップされます)。

C++11 標準では、さらにいくつかの Unicode 対応の型とリテラルが提供されます。追加の型はchar16_tchar32_tで、その値は文字を表す Unicode コードポイントです。これらは、それぞれ UTF-16 および UTF-32 に類似しています。

基本的な多言語面の文字を格納するには文字リテラルが必要なので、char16_tリテラルが必要になります。これは、たとえば のように記述できますu'\u0B95'。したがって、警告やエラーなしで、次のようにコードを記述できます。

char16_t testing[40];
testing[0] = u'\u0B95';
testing[1] = u'\u0BA3';
testing[2] = u'\u0B82';
testing[3] = u'\0';

残念ながら、I/O ライブラリはこれらの新しい型をうまく処理できません。

上記のように文字リテラルを使用する必要がない場合は、新しい UTF-8 文字列リテラルを使用できます。

const char* testing = u8"\u0B95\u0BA3\u0B82";

これにより、文字が UTF-8 としてエンコードされます。

于 2012-11-24T23:41:36.020 に答える