¿Cómo verificar si un carácter Unicode está dentro del rango dado en C?
-
03-07-2019 - |
Pregunta
La siguiente función fue escrita para java y adaptada para C.
bool isFullwidthKatakana(WideChar C)
{
return(('\u30a0'<=C)&&(C<='\u30ff'));
}
El problema es que mi marco (" CodeGear C ++ Builder ") muestra este error:
[Advertencia BCC32] Unit1.cpp (101): W8114 Personaje representado por nombre de carácter universal '\ u30a0' no se puede representar en la corriente página de códigos (1252)
y no devuelve verdadero si se cumplen las condiciones.
Por ejemplo, una entrada es '?' (0x30A2).
¿Qué debo hacer? ¿Cómo puedo cambiar la página de códigos?
Gracias a las tres respuestas, todas lo resolvieron.
return((0x30a0<=C)&&(C<=0x30ff));
Parece que la expresión \ u30a0 no era correcta, todo esto era correcto
return((0x30a0<=C)&&(C<=0x30ff));
return (unsigned int) C >= 0x30a0u && (unsigned int) C <= 0x30ffu;
return((L'\u30a0'<=C)&&(C<=L'\u30ff'));
Solución
Debería ser posible convertir (explícita o implícitamente) el carácter a un entero sin signo, y luego usar tales constantes:
return (unsigned int) C >= 0x30a0u && (unsigned int) C <= 0x30ffu;
debería hacerlo.
Por cierto, recomiendo no usar un nombre de argumento en mayúsculas (de un solo carácter), es muy fácil pensar que es una constante de compilación (que normalmente está en mayúsculas en C y C ++).
Otros consejos
El error parece estar relacionado con el uso del literal de carácter, no de la prueba. Entonces pruebe contra el punto de código como un literal integral, por ejemplo:
bool isFullwidthKatakana(WideChar C)
{
return(( (WideChar)0x30a0 <= C )&&(C <= (WideChar)0x30ff ));
}
IIUC, debes verificar si un carácter de Unicode ancho (probablemente utf-16 ya que estás en Windows) está dentro de un rango. Esto se puede hacer con el código que has mostrado, solo tienes que hacer que los literales de caracteres sean amplios. En C ++ y C, se crean al anteponer L al literal, por ejemplo. L'a '
o L " ahoj "
.
En tu caso, lo intentaría
bool isFullwidthKatakana(WideChar C)
{
return((L'\u30a0'<=C)&&(C<=L'\u30ff'));
}