c++ - isalpha equivalente para wchar_t
unicode localization (6)
¿Cuál es la función equivalente para isalpha o isalnum usando wchar_t?
wctype?
un ejemplo sería bueno también
Gracias
Eche un vistazo a std::isaplha<charT>
desde <locale>
. Podría usar eso como std::isalpha<wchar_t>
.
El encabezado es <wctype.h>
. Los nombres básicos de macro / función tienen una ''w'' en ellos:
int iswalpha(wint_t wc);
int iswalnum(wint_t wc);
Etc.
También están las funciones:
wctype_t wctype(const char *property);
int iswctype(wint_t wc, wctype_t desc);
Podrías escribir, por ejemplo:
if (iswctype(wc, wctype("alnum")))
...process a wide alphanumeric...
O simplemente puedes escribir:
if (iswalnum(wc))
...process a wide alphanumeric...
Depende de cómo se defina "equivalente". Las clases de caracteres C son bastante simples en comparación con las clases de caracteres Unicode. Por ejemplo, si desea probar si un punto de código dado usualmente representa una letra (para alguna definición de "letra"), puede probar para la categoría general L
; Si desea verificar si una cadena dada comprende un identificador válido, podría usar UAX # 31 , etc. iswalnum
e iswalpha
podrían dar el resultado esperado dependiendo de la configuración "local" actual.
Usted incluye la etiqueta "localización" en su pregunta. En el caso de escribir una solicitud internacional, debe definir claramente qué quiere decir con caracteres alfabéticos o numéricos . Si escribe programas para Windows, le recomendaré que use la función GetStringTypeEx
(vea http://msdn.microsoft.com/en-us/library/dd318118.aspx ). Por ejemplo, el código
BOOL bSuccess;
int isTrue;
WORD wCharType;
bSuccess = GetStringTypeExW (LOCALE_USER_DEFAULT, CT_CTYPE1, L"a", 1, &wCharType);
if (wCharType & C1_ALPHA == C1_ALPHA) {
//
}
También puede usar CT_CTYPE3
o CT_CTYPE2
para determinar si un carácter es un Ideographic o si es un número europeo.
Para ser más exactos solo intente utilizar la función iswalpha
, IsCharAlphaW
, iswalnum
, iswdigit
y GetStringTypeExW
para probar los siguientes caracteres: L''a '', L''ü'', L''á '', L''я'' (carácter ruso), L ''ノ''(Caricatura japonesa en Katakana), L'' 一 ''(1 en japonés). Verás eso
- iswalpha (L ''ノ'') retorno alfa
- IsCharAlphaW (L ''ノ'') devuelve NO alfa
- iswalnum (L ''一'') devuelve alfa o dígito
- iswdigit (L ''一'') return NO dígito
El código
bSuccess = GetStringTypeExW (LOCALE_USER_DEFAULT, CT_CTYPE2, L"一", 1, &wCharType);
if ((wCharType & C2_EUROPENUMBER) == wCharType) {
// numeric
}
di que L "一" NO es un número europeo. Puede usar GetStringTypeExW
para destinduish número europeo de, por ejemplo, número árabe, etc.
Por lo tanto, le recomiendo que especifique su requisito más exactamente y luego elija la API según los requisitos. En general, el uso de la API C no es la mejor manera para una aplicación internacional.
Estrictamente hablando, esto no es posible en visual studio / windows, porque wchar_t tiene 2 bytes en esta plataforma y no puede contener un punto de código Unicode.
Lo que realmente necesitas es una función que acepte char *. Usted tiene uno en ICU AFAIK.
Ver también https://.com/questions/1049947/should-utf-16-be-considered-harmful