3

C++ 文字配列内の拡張 ASCII 値 (128 ~ 255) の存在を検出する方法。

4

8 に答える 8

20

拡張 ASCII などというものは存在しないことを覚えておいてください。ASCII は以前も現在も 0 から 127 の間でのみ定義されています。それより上の値はすべて無効であるか、ASCII 以外の定義済みエンコーディング (ISO-8859-1 など) である必要があります。

すべてのソフトウェア開発者が絶対に、積極的に Unicode と文字セットについて知っておく必要がある絶対的な最小値 (言い訳はありません!) をお読みください。

それ以外: 127 を超える値 (signed chars を使用する場合は 0 未満) を反復してチェックすることの何が問題になっていますか?

于 2009-03-06T10:18:32.403 に答える
8

Char は符号付きまたは符号なしのいずれでもかまいません。ただし、これは実際には問題ではありません。実際には、各文字が有効な ASCII かどうかを確認する必要があります。これは肯定的で曖昧でないチェックです。各文字が >=0 かつ <= 127 であるかどうかを確認するだけです。それ以外 (正または負、「拡張 ASCII」または UTF-8) は無効です。

于 2009-03-06T11:04:35.647 に答える
3

もう isascii を使っている人はいないのですか?

char c = (char) 200;

if (isascii(c))
{
    cout << "it's ascii!" << endl;
}
else
{
    cout << "it's not ascii!" << endl;
}
于 2012-02-07T23:27:44.180 に答える
2

問題のマシンのエンディアンを知っていることを確認し、ビットごとの AND マスクで最上位ビットを確認してください。

if (ch & 128) {
  // high bit is set
} else {
  // looks like a 7-bit value
}

しかし、おそらくこれに使用する必要があるロケール関数があります。いっそのこと、どのような文字エンコーディングデータが入ってくるかを知っておいてください。それを推測しようとすることは、データベース フィールドに入力されるデータの形式を推測しようとするようなものです。入るかもしれないけどガベージイン、ガベージアウト。

于 2009-03-06T10:42:22.737 に答える
1

配列を繰り返し処理し、各文字が 128 から 255 の範囲に入らないことを確認しますか?

于 2009-03-06T10:17:43.980 に答える
0

値が負でないことを確認してください

于 2009-03-06T10:18:18.753 に答える
0
bool detect(const signed char* x) {
  while (*x++ > 0);
  return x[-1];
}
于 2009-03-06T10:18:41.670 に答える