Unicode文字がCで指定された範囲内にあるかどうかを確認する方法?
-
03-07-2019 - |
質問
次の関数はjava用に作成され、C用に適合されています。
bool isFullwidthKatakana(WideChar C)
{
return(('\u30a0'<=C)&&(C<='\u30ff'));
}
問題は、私のフレームワーク(&quot; CodeGear C ++ Builder&quot;)がこのエラーを表示することです:
[BCC32警告] Unit1.cpp(101):W8114 によって表される文字 汎用文字名「\ u30a0」 現在では表現できません コードページ(1252)
そして条件が満たされているかどうかはtrueを返しません。
たとえば、1つの入力は「&#12450;」です(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'));
解決
文字を(明示的または暗黙的に)符号なし整数にキャストし、そのような定数を使用することができるはずです:
return (unsigned int) C >= 0x30a0u && (unsigned int) C <= 0x30ffu;
実行する必要があります。
ところで、(1文字の)大文字の引数名を使用することはお勧めしません。コンパイル時の定数(CとC ++では通常大文字)であると考えるのは非常に簡単です。
他のヒント
エラーは、テストではなく、文字リテラルの使用に関連しているようです。したがって、コードポイントを整数リテラルとしてテストします。例:
bool isFullwidthKatakana(WideChar C)
{
return(( (WideChar)0x30a0 <= C )&&(C <= (WideChar)0x30ff ));
}
IIUC、ワイドユニコード文字(Windowsを使用している場合はおそらくutf-16)が範囲内にあるかどうかを確認する必要があります。これは、示したコードで実行できます。文字リテラルをワイド文字リテラルにするだけです。 C ++およびCでは、Lをリテラルの先頭に追加することにより作成されます。 L'a '
または L&quot; ahoj&quot;
。
あなたの場合、試してみます
bool isFullwidthKatakana(WideChar C)
{
return((L'\u30a0'<=C)&&(C<=L'\u30ff'));
}