java - studio - ¿Por qué Apache Commons considera ''१२३'' numérico?
programacion android pdf 2018 (5)
El símbolo १२३ es el mismo que 123 para el idioma nepalés o cualquier otro idioma que use la escritura Devanagari , como hindi, gujarati, etc.
De acuerdo con la documentación de Apache Commons Lang para
StringUtils.isNumeric()
, la cadena ''१२३'' es numérica.
Como creía que esto podría ser un error en la documentación, realicé pruebas para verificar la declaración. Descubrí que según Apache Commons es numérico.
¿Por qué es esta cadena numérica? ¿Qué representan esos personajes?
Los símbolos ''१२३'' en realidad se derivan del idioma hindi (Básicamente del idioma sánscrito, es decir, Devanagiri) que representan valores numéricos como:
१ representa 1
२ representa 2
y de la misma manera
Porque esa "CharSequence contiene solo dígitos Unicode" (citando su StringUtils.isNumeric() ).
Todos los caracteres devuelven verdadero para
Character.isDigit
:
Algunos rangos de caracteres Unicode que contienen dígitos:
- ''/ u0030'' a ''/ u0039'', dígitos ISO-LATIN-1 (''0'' a ''9'')
- ''/ u0660'' a ''/ u0669'', dígitos árabe-índicos
- ''/ u06F0'' a ''/ u06F9'', dígitos árabes-índicos extendidos
- ''/ u0966'' hasta ''/ u096F'', dígitos de Devanagari
- ''/ uFF10'' a ''/ uFF19'', dígitos de ancho completo
Muchos otros rangos de caracteres también contienen dígitos.
१२३
son dígitos de Devanagari:
Puedes usar
Character#getType
para verificar la categoría general del personaje:
System.out.println(Character.DECIMAL_DIGIT_NUMBER == Character.getType(''१''));
Esto imprimirá
true
, que es una "evidencia" de que ''१'' es un
número de dígito
.
Ahora examinemos el valor unicode del carácter ''१'':
System.out.println(Integer.toHexString(''१''));
// 967
Este número está en el rango de
dígitos
de
Devanagari
, que es:
/u0966
hasta
/u096F
.
Intenta también:
Character.UnicodeBlock block = Character.UnicodeBlock.of(''१'');
System.out.println(block.toString());
// DEVANAGARI
Devanagari es:
es un alfabeto abugida (alfasilábico) de India y Nepal
"१२३" es un "123" (latín básico unicode).
Leyendo:
Si alguna vez quiere saber qué propiedades tiene un "personaje" particular (y hay bastantes), vaya directamente a la fuente: Unicode.org . Tienen herramientas de investigación que pueden mostrarle casi todo lo que le gustaría saber.
-
Si desea ver todas las propiedades de un personaje específico, intente lo siguiente:
http://unicode.org/cldr/utility/character.jsp?a=१
o:
-
Si desea ver todos los caracteres clasificados como "dígitos decimales" (es decir, con valores numéricos de 0 a 9), intente lo siguiente:
http://unicode.org/cldr/utility/list-unicodeset.jsp?a=[:Numeric_Type=Decimal:]
(550 puntos de código - actualmente / a partir de Unicode 9.0) -
Si desea ver todos los caracteres clasificados como "números de dígitos no decimales" (es decir, fracciones, encerrados en un círculo, etc.), intente lo siguiente:
http://unicode.org/cldr/utility/list-unicodeset.jsp?a=[:Numeric_Type=Numeric:]
(836 puntos de código - actualmente / a partir de Unicode 9.0) -
Si desea ver todos los caracteres clasificados como "dígitos decimales" (es decir, con valores numéricos de 0 a 9), pero solo hasta Unicode 6.0 (que utiliza .NET) , intente lo siguiente:
http://unicode.org/cldr/utility/list-unicodeset.jsp?a=[:Numeric_Type=Decimal:]%26[:Age=6.0:]
(420 puntos de código, y no debería cambiar) -
Si desea ver todos los caracteres clasificados como "dígitos decimales" (es decir, con valores numéricos de 0 a 9), pero solo hasta Unicode 6.0 (que utiliza .NET), y solo en el plano base multilingüe / sin caracteres suplementarios ( es decir, nada por encima del Punto de código 65535 / U + 0xFFFF) , intente lo siguiente:
http://unicode.org/cldr/utility/list-unicodeset.jsp?a=[:Numeric_Type=Decimal:]%26[:Age=6.0:]%26[:bmp=Yes:]
(350 puntos de código, y no debería cambiar)
TENGA EN CUENTA:
El Consorcio Unicode produce una especificación, no un software.
Esto significa que corresponde a cada proveedor de software implementar la especificación con la
mayor precisión posible
.
Entonces, al igual que HTML, JavaScript, CSS, SQL, etc., hay una variación entre diferentes plataformas, idiomas, etc.
Por ejemplo, encontré un error en .NET Framework de Microsoft por el cual las letras latinas
AZ
y
az
- los puntos de código 0x24B6 a 0x24E9 - no se registran correctamente como
char.IsLetter = true
(
informe de error aquí
)
Y eso conduce a un comportamiento inesperado en la funcionalidad relacionada, como cuando se llama al método
TextInfo.ToTitleCase()
(
informe de error aquí
).