2009-03-03 17 views
0

Die folgende Funktion wurde für Java geschrieben und für C.Wie überprüft man, ob ein Unicode-Zeichen innerhalb eines gegebenen Bereichs in C liegt?

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

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

[BCC32 Warning] Unit1.cpp(101): W8114 Character represented by universal-character-name '\u30a0' cannot be represented in the current code page (1252)

und Es ist nicht wahr, ob die Bedingungen erfüllt sind.

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

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

Danke an die drei Antworten, die sie alle gelöst haben.

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

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

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

Vorschlag: den Titel ändern, da Sie nicht, wie bitten zu prüfen, ob ein Codepunkt gültig ist (UTF-8 kodieren * alle * gültig Unicode-Codepoints). – Richard

+0

Welche Version von C++ Builder verwenden Sie? – stukelly

+0

CodeGear C++ Builder 2009 – Nek

Antwort

0

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

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

sollte es tun.

Übrigens, ich würde empfehlen, einen Großbuchstaben-Argumentnamen (ein Zeichen) zu verwenden, es ist sehr einfach zu denken, dass es eine Kompilierzeitkonstante ist (die in C und C++ typischerweise Großbuchstaben sind).

0

IIUC, Sie müssen überprüfen, ob ein breites Unicode-Zeichen (wahrscheinlich UTF-16, da Sie unter Windows sind) in einem Bereich ist. Dies kann mit dem Code getan werden, den Sie gezeigt haben, Sie müssen nur die Zeichenliterale breite Zeichenliterale machen. In C++ und C werden sie erzeugt, indem L dem Literal vorangestellt wird, z. L'a' oder L"ahoj".

In Ihrem Fall würde ich erscheint

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

Der Fehler versuchen, die Verwendung des Zeichenliteral, nicht der Test zusammenzuhängen. So Test gegen den Codepoint als integralen wörtlichen, zB:

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