C++ расширенные символы Ascii
Как обнаружить наличие расширенных значений ASCII (от 128 до 255) в символьном массиве C++.
8 ответов
Пожалуйста, помните, что нет такой вещи, как расширенный ASCII. ASCII был и определен только между 0 и 127. Все вышеперечисленное либо недопустимо, либо должно быть в определенной кодировке, отличной от ASCII (например, ISO-8859-1).
Пожалуйста, ознакомьтесь с Абсолютным минимумом, который должен знать каждый разработчик программного обеспечения. Абсолютно, положительно должен знать о Unicode и наборах символов (никаких оправданий!).
Кроме этого: что не так с итерацией и проверкой любого значения> 127 (или <0 при использовании подписи char
s)?
Символ может быть подписан или не подписан. Это не имеет большого значения. Вы действительно хотите проверить, является ли каждый символ действительным ASCII. Это положительная, не однозначная проверка. Вы просто проверяете, является ли каждый символ>=0 и <= 127. Все остальное (положительное или отрицательное, "Extended ASCII" или UTF-8) недопустимо.
Никто больше не использует isascii?
char c = (char) 200;
if (isascii(c))
{
cout << "it's ascii!" << endl;
}
else
{
cout << "it's not ascii!" << endl;
}
Убедитесь, что вы знаете порядковый номер рассматриваемой машины, и просто проверьте старший бит с помощью битовой маски И:
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];
}
(char) c = (char) 200;
if (isascii(c))
{
cout << "it's ascii!" << endl;
}
else
{
cout << "it's not ascii!" << endl;
}
попробуй этот код