C++ 文字配列内の拡張 ASCII 値 (128 ~ 255) の存在を検出する方法。
8 に答える
拡張 ASCII などというものは存在しないことを覚えておいてください。ASCII は以前も現在も 0 から 127 の間でのみ定義されています。それより上の値はすべて無効であるか、ASCII 以外の定義済みエンコーディング (ISO-8859-1 など) である必要があります。
すべてのソフトウェア開発者が絶対に、積極的に Unicode と文字セットについて知っておく必要がある絶対的な最小値 (言い訳はありません!) をお読みください。
それ以外: 127 を超える値 (signed char
s を使用する場合は 0 未満) を反復してチェックすることの何が問題になっていますか?
Char は符号付きまたは符号なしのいずれでもかまいません。ただし、これは実際には問題ではありません。実際には、各文字が有効な ASCII かどうかを確認する必要があります。これは肯定的で曖昧でないチェックです。各文字が >=0 かつ <= 127 であるかどうかを確認するだけです。それ以外 (正または負、「拡張 ASCII」または UTF-8) は無効です。
もう isascii を使っている人はいないのですか?
char c = (char) 200;
if (isascii(c))
{
cout << "it's ascii!" << endl;
}
else
{
cout << "it's not ascii!" << endl;
}
問題のマシンのエンディアンを知っていることを確認し、ビットごとの AND マスクで最上位ビットを確認してください。
if (ch & 128) {
// high bit is set
} else {
// looks like a 7-bit value
}
しかし、おそらくこれに使用する必要があるロケール関数があります。いっそのこと、どのような文字エンコーディングデータが入ってくるかを知っておいてください。それを推測しようとすることは、データベース フィールドに入力されるデータの形式を推測しようとするようなものです。入るかもしれないけどガベージイン、ガベージアウト。
配列を繰り返し処理し、各文字が 128 から 255 の範囲に入らないことを確認しますか?
値が負でないことを確認してください
bool detect(const signed char* x) {
while (*x++ > 0);
return x[-1];
}