7

ソースコードの文字にアクセントを付けて、同等のユニコードに置き換えてみました。実際の非ASCII文字を使用すると、プログラムはコンパイルされて正しく動作しますが、これが移植性に影響を与える可能性があるのではないかと心配しています。同等のUnicodeを使用しようとすると、警告が表示されます。大文字と小文字のラベルの値が型の最大値を超えています。または警告:文字定数が型に対して長すぎ、プログラムの実行時に大文字と小文字が一致しません。

for(int i = 0; i < ent->d_namlen; i++)
{
    switch(ent->d_name[i])
    {
        case 'á' : //0x00E1
        ...
    }
 }

entはstruct dirent *ent、呼び出し元の関数から渡されます。

、、をcase 'á' :試した代わりに、一重引用符なしですべてを試しました。その場合、コンパイルされません(たとえば、\ u00E1がこのスコープで宣言されていないことを示します)。case '0x00E1' :case L 'u00E1 :case \U000000E9 :case '\u00E1' :

4

2 に答える 2

2

áは非ASCII文字であり、ソースコード、、、struct direntまたはその両方で複数バイトとして表されています。

オンに-Wmulticharすると、おそらく警告が表示されます

warning: multi-character character constant

文字定数'á'が複数のバイトで構成されていることを示します。この場合、おそらくUTF-8にありますが、チェックしてください(たとえば、を使用してfile)。direntまた、エントリのエンコーディングを確認する必要があります。

文字列内の非ASCII文字を照合するには、次のことを行う必要があります。

  • 文字列と文字が同じエンコーディングで表されていることを確認してください。
    • 固定長のエンコーディング(つまり、UCS-4)と、各コードポイントを格納するのに十分な幅のタイプ(例int)を使用するか、または
    • 再起動可能な可変長エンコーディング(つまりUTF-8)を使用し、サブストリングマッチングを使用します。

変換方法の例については、http://en.cppreference.com/w/cpp/locale/codecvt_utf8を参照してください。

于 2012-08-22T14:25:43.143 に答える
0

switch式をunsignedtypeに変換することでうまくいくと思います。

switch((unsigned char)ent->d_name[i])
{
...
}
于 2012-08-22T12:09:08.740 に答える