2009-03-03 20 views
0

次の関数は、Javaのために書かれた、私のフレームワーク( "CodeGearのC++ Builderは")このエラーを示していることC.ユニコード文字がCで指定された範囲内にあるかどうかをチェックする方法は?

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

問題があるために適応されています:

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

とを条件が満たされたかどうかはtrueを返しません。

たとえば、入力は「ア」(0x30A2)です。

どうすればよいですか?コードページを変更するにはどうすればよいですか?

3人の回答に感謝します。

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

それは表現\ u30a0が正しくなかったと思われ、これはすべての符号なし整数に(明示的または暗黙的に)文字をキャストすることが可能です

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

提案:あなたはコードポイントが有効であるかどうかを確認する方法を求めていないので(UTF-8は、*すべての*有効なUnicodeコードポイントをエンコードすることができ、タイトルを変更するに)。 – Richard

+0

使用しているC++ Builderのバージョンは? – stukelly

+0

CodeGear C++ Builder 2009 – Nek

答えて

0

正しかったです、そのような定数を使用してください:

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

それを行う必要があります。

ところで、大文字の大文字の引数名を使用することをお勧めします。コンパイル時の定数(通常はCとC++で大文字です)と考えるのはとても簡単です。

0

IIUCでは、ワイドユニコード文字(Windowsの場合はおそらくutf-16)が範囲内にあるかどうかを確認する必要があります。これはあなたが示したコードを使って行うことができます。文字リテラルをワイド文字リテラルにするだけです。 C++とCでは、Lをリテラルに付加することで作成されます。 L'a'またはL"ahoj"。あなたのケースでは

、私は

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

エラーがリテラル文字ではなく、テストの使用に関連すると思わ試してみました。だから、整数リテラルとしてコードポイントに対するテスト、例えば:

bool isFullwidthKatakana(WideChar C) 
{ 
    return(((WideChar)0x30a0 <= C)&&(C <= (WideChar)0x30ff)); 
} 
関連する問題