Unicode文字がCで指定された範囲内にあるかどうかを確認する方法?

StackOverflow https://stackoverflow.com/questions/605985

  •  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'));
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top