Как проверить, находится ли символ Юникода в заданном диапазоне в C?
-
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'));
}