Come verificare se un carattere unicode rientra nell'intervallo indicato in C?
-
03-07-2019 - |
Domanda
La seguente funzione è stata scritta per java ed è stata adattata per C.
bool isFullwidthKatakana(WideChar C)
{
return(('\u30a0'<=C)&&(C<='\u30ff'));
}
Il problema è che il mio framework (" CodeGear C ++ Builder ") mostra questo errore:
[Avviso BCC32] Unit1.cpp (101): W8114 Personaggio rappresentato da nome-carattere-universale '\ u30a0' non può essere rappresentato nella corrente code page (1252)
e non restituisce vero se le condizioni sono soddisfatte.
Ad esempio un input è '& # 12450;' (0x30A2).
Cosa devo fare? Come posso cambiare la tabella codici?
Grazie alle tre risposte che hanno risolto tutti.
return((0x30a0<=C)&&(C<=0x30ff));
Sembra che l'espressione \ u30a0 non sia corretta, tutto questo era corretto
return((0x30a0<=C)&&(C<=0x30ff));
return (unsigned int) C >= 0x30a0u && (unsigned int) C <= 0x30ffu;
return((L'\u30a0'<=C)&&(C<=L'\u30ff'));
Soluzione
Dovrebbe essere possibile eseguire il cast (esplicitamente o implicitamente) del carattere in un numero intero senza segno, quindi utilizzare solo tali costanti:
return (unsigned int) C >= 0x30a0u && (unsigned int) C <= 0x30ffu;
dovrebbe farlo.
A proposito, raccomanderei di non usare un nome di argomento maiuscolo (a carattere singolo), è molto facile pensare che sia una costante di compilazione (che in genere è maiuscola in C e C ++).
Altri suggerimenti
L'errore sembra essere correlato all'uso del carattere letterale, non al test. Quindi prova contro il punto di codice come letterale integrale, ad esempio:
bool isFullwidthKatakana(WideChar C)
{
return(( (WideChar)0x30a0 <= C )&&(C <= (WideChar)0x30ff ));
}
IIUC, devi verificare se un carattere unicode ampio (probabilmente utf-16 poiché sei su Windows) è all'interno di un intervallo. Questo può essere fatto con il codice che hai mostrato, devi solo rendere letterali i caratteri letterali a caratteri ampi. In C ++ e C, sono fatti anteponendo L al letterale, ad es. L'a '
o L " ahoj "
.
Nel tuo caso, proverei
bool isFullwidthKatakana(WideChar C)
{
return((L'\u30a0'<=C)&&(C<=L'\u30ff'));
}