Como verificar se um caractere Unicode é dentro de determinado intervalo em C?
-
03-07-2019 - |
Pergunta
A função seguinte foi escrito para Java e foi adaptado para C.
bool isFullwidthKatakana(WideChar C)
{
return(('\u30a0'<=C)&&(C<='\u30ff'));
}
O problema é que o meu quadro ( "++ Builder CodeGear C") mostra este erro:
[bcc32 Aviso] Unit1.cpp (101): W8114 Personagem representado por universal-character-name '\ u30a0' não pode ser representado na atual página de código (1252)
e não retornar true se estão reunidas as condições.
Por exemplo um de entrada é '?' (0x30A2).
O que devo fazer? Como posso alterar a página de código?
Obrigado aos três respostas todos eles resolvidos-lo.
return((0x30a0<=C)&&(C<=0x30ff));
Parece que o que a expressão \ u30a0 não era correto, tudo isso fosse correta ??p>
return((0x30a0<=C)&&(C<=0x30ff));
return (unsigned int) C >= 0x30a0u && (unsigned int) C <= 0x30ffu;
return((L'\u30a0'<=C)&&(C<=L'\u30ff'));
Solução
Deve ser possível elenco (explícita ou implicitamente) o personagem para um inteiro sem sinal, e depois é só usar essas constantes:
return (unsigned int) C >= 0x30a0u && (unsigned int) C <= 0x30ffu;
deve fazê-lo.
A propósito, eu recomendo contra o uso de um (de um único caractere) maiúscula nome do argumento, é muito fácil pensar que é uma constante de tempo de compilação (que são tipicamente maiúsculas em C e C ++).
Outras dicas
Aparece o erro a ser relacionada ao uso do literal caráter, não o teste. Então teste contra o codepoint como uma literal integral, por exemplo:
bool isFullwidthKatakana(WideChar C)
{
return(( (WideChar)0x30a0 <= C )&&(C <= (WideChar)0x30ff ));
}
IIUC, você precisa verificar se um caractere Unicode de largura (provavelmente utf-16 desde que você estiver no Windows) é dentro de uma faixa. Isso pode ser feito com o código que você mostrou, você apenas tem que fazer os literais de caracteres literais de caracteres largos. Em C ++ e C, em que são feitas, antecedendo L para o literal, por exemplo. L'a'
ou L"ahoj"
.
No seu caso, eu tentaria
bool isFullwidthKatakana(WideChar C)
{
return((L'\u30a0'<=C)&&(C<=L'\u30ff'));
}