Como verificar se um caractere Unicode é dentro de determinado intervalo em C?

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

  •  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

return((0x30a0<=C)&&(C<=0x30ff));
return (unsigned int) C >= 0x30a0u && (unsigned int) C <= 0x30ffu;
return((L'\u30a0'<=C)&&(C<=L'\u30ff'));
Foi útil?

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'));
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top