Как проверить, находится ли символ Юникода в заданном диапазоне в C? - PullRequest
0 голосов
/ 03 марта 2009

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

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

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

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

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

Например, один вход - «'» (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'));

Ответы [ 3 ]

0 голосов
/ 03 марта 2009

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

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

bool isFullwidthKatakana(WideChar C)
{
  return((L'\u30a0'<=C)&&(C<=L'\u30ff'));
}
0 голосов
/ 03 марта 2009

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

bool isFullwidthKatakana(WideChar C)
{
  return(( (WideChar)0x30a0 <= C )&&(C <= (WideChar)0x30ff ));
}
0 голосов
/ 03 марта 2009

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

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

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

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

...