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'));
È stato utile?

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'));
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top