Frage

Die folgende Funktion wurde für Java geschrieben und ist für C angepasst.

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

Das Problem ist, dass mein Rahmen ( "CodeGear C ++ Builder") zeigt diesen Fehler:

  

[BCC32 Warning] Unit1.cpp (101): W8114   Charakter vertreten durch   universal-Charakter Name '\ u30a0'   kann nicht in der aktuellen dargestellt werden   Codepage (1252)

und es nicht wieder wahr, ob die Voraussetzungen erfüllt sind.

Zum Beispiel ein Eingang 'ア' (0x30A2).

Was soll ich tun? Wie kann ich die Codepage ändern?

Vielen Dank an die drei Antworten, die sie alle beschlossen.

return((0x30a0<=C)&&(C<=0x30ff));

Es scheint, die, dass der Ausdruck \ u30a0 war nicht richtig, das alle richtig war

return((0x30a0<=C)&&(C<=0x30ff));
return (unsigned int) C >= 0x30a0u && (unsigned int) C <= 0x30ffu;
return((L'\u30a0'<=C)&&(C<=L'\u30ff'));
War es hilfreich?

Lösung

Es sollte möglich sein zu werfen (explizit oder implizit) das Zeichen auf eine ganze Zahl ohne Vorzeichen, und dann nur solche Konstanten verwenden:

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

sollte es tun.

By the way, würde ich empfehlen, gegen die Verwendung eines (einzigen Zeichen) Groß Argument Namen, es ist sehr einfach zu denken, dass es einen Compiler-Konstante (die in der Regel in Großbuchstaben sind in C und C ++).

Andere Tipps

Der Fehler scheint die Verwendung des Zeichenliteral, nicht der Test zusammenzuhängen. So Test gegen den Codepoint als integrales wörtliches, zum Beispiel:

bool isFullwidthKatakana(WideChar C)
{
  return(( (WideChar)0x30a0 <= C )&&(C <= (WideChar)0x30ff ));
}

IIUC, müssen Sie prüfen, ob ein großes Unicode-Zeichen (wahrscheinlich utf-16, da Sie unter Windows sind) innerhalb eines Bereichs liegt. Dies kann mit dem Code getan werden Sie gezeigt haben, müssen Sie nur noch die Zeichenliterale breiten Zeichenliterale machen. In C ++ und C, werden sie durch das Voranstellen von L an den wörtlichen, zB aus. L'a' oder L"ahoj".

In Ihrem Fall würde ich versuchen

bool isFullwidthKatakana(WideChar C)
{
  return((L'\u30a0'<=C)&&(C<=L'\u30ff'));
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top