如何检查一个unicode字符是否在C的给定范围内?

时间:2009-03-03 11:14:43

标签: c utf-8 c++builder

以下函数是为java编写的,并且已经适用于C。

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

问题是我的框架(“CodeGear C ++ Builder”)显示了这个错误:

  

[BCC32警告] Unit1.cpp(101):W8114   代表的人物   通用字符名称'\ u30a0'   不能代表当前   代码页(1252)

并且无论条件是否满足,它都不会返回。

例如,一个输入是'ア'(0x30A2)。

我该怎么办?如何更改代码页?

谢谢你们三个答案,他们都解决了这个问题。

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'));

3 个答案:

答案 0 :(得分:0)

应该可以将(显式或隐式)转换为无符号整数,然后只使用这些常量:

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

应该这样做。

顺便说一句,我建议不要使用(单字符)大写参数名称,很容易认为它是一个编译时常量(在C和C ++中通常是大写的)。

答案 1 :(得分:0)

IIUC,你需要检查一个宽的unicode字符(因为你在Windows上可能是utf-16)是否在一个范围内。这可以使用您显示的代码完成,您只需要使字符文字宽字符文字。在C ++和C中,它们是通过在文字中加上L来制作的,例如。 L'a'L"ahoj"

在你的情况下,我会尝试

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

答案 2 :(得分:0)

错误似乎与字符文字的使用有关,而不是测试。因此,将codepoint作为一个完整的文字进行测试,例如:

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