Как проверить, находится ли символ Юникода в заданном диапазоне в C?

StackOverflow https://stackoverflow.com/questions/605985

  •  03-07-2019
  •  | 
  •  

Вопрос

Следующая функция была написана для Java и адаптирована для C.

bool isFullwidthKatakana(WideChar C)
{
  return(('\u30a0'<=C)&&(C<='\u30ff'));
}

Проблема в том, что моя платформа («CodeGear C++Builder») показывает эту ошибку:

[Предупреждение BCC32] Unit1.cpp(101):W8114 символ, представленный Universal-character-name ' u30a0', не может быть представлен на текущей кодовой странице (1252)

и он не возвращает true, выполняются ли условия.

Например, один вход — «ア» (0x30A2).

Что я должен делать?Как я могу изменить кодовую страницу?

Спасибо трем ответам, они все решили проблему.

return((0x30a0<=C)&&(C<=0x30ff));

Кажется, что выражение \u30a0 было неправильным, все было правильно.

return((0x30a0<=C)&&(C<=0x30ff));
return (unsigned int) C >= 0x30a0u && (unsigned int) C <= 0x30ffu;
return((L'\u30a0'<=C)&&(C<=L'\u30ff'));
Это было полезно?

Решение

Должна быть возможность привести (явно или неявно) символ к беззнаковому целому числу, а затем просто использовать такие константы:

return (unsigned int) C >= 0x30a0u && (unsigned int) C <= 0x30ffu;

должен это сделать.

Кстати, я бы не рекомендовал использовать имя аргумента (односимвольное) в верхнем регистре, очень легко подумать, что это константа времени компиляции (которая обычно имеет верхний регистр в C и C++).

Другие советы

Судя по всему, ошибка связана с использованием символьного литерала, а не теста.Поэтому проверьте кодовую точку как целочисленный литерал, например:

bool isFullwidthKatakana(WideChar C)
{
  return(( (WideChar)0x30a0 <= C )&&(C <= (WideChar)0x30ff ));
}

IIUC, вам нужно проверить, находится ли широкий символ Юникода (вероятно, utf-16, поскольку вы используете Windows) в пределах диапазона.Это можно сделать с помощью показанного вами кода, вам просто нужно сделать символьные литералы широкими символьными литералами.В C++ и C они создаются добавлением L к литералу, например. L'a' или L"ahoj".

В твоем случае я бы попробовал

bool isFullwidthKatakana(WideChar C)
{
  return((L'\u30a0'<=C)&&(C<=L'\u30ff'));
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top