Esta es la contestación más exacta que te podemos brindar, pero estúdiala detenidamente y valora si se adapta a tu proyecto.
Solución:
Él Character
La clase de API de Java tiene varias funciones que puede usar.
Puede convertir su carácter a minúsculas en ambos lados:
Character.toLowerCase(name1.charAt(i)) == Character.toLowerCase(name2.charAt(j))
También hay métodos que puede usar para verificar si la letra está en mayúsculas o minúsculas:
Character.isUpperCase('P')
Character.isLowerCase('P')
no puedes Realmente hacer el trabajo bastante bien con toLowerCase
ya sea en un string o en un personaje. El problema es que hay variantes de glifos en mayúsculas o minúsculas, y dependiendo de si usa mayúsculas o minúsculas, sus glifos pueden o no conservarse. Ni siquiera está claro lo que tú significar cuando dices que se comparan dos variantes de un glifo en minúscula ignorando mayúsculas y minúsculas: ¿son o no son lo mismo? (Tenga en cuenta que también hay mixed-glifos de caso: u01c5, u01c8, u01cb, u01f2
o Dž, Lj, Nj, Dz, pero cualquier método sugerido aquí funcionará en ellos, siempre y cuando cuenten igual que sus variantes en mayúsculas o minúsculas).
Hay un problema adicional con el uso Char
: hay unos 80 puntos de código que no se pueden representar con un solo Char
que son variantes en mayúsculas/minúsculas (40 de cada), al menos según lo detectado por el punto de código de Java en mayúsculas/minúsculas. Por lo tanto, debe obtener los puntos de código y cambiar el caso en estos.
Pero los puntos de código no ayudan con los glifos variantes.
De todos modos, aquí hay una lista completa de los glifos que son problemáticos debido a las variantes, que muestra cómo les va frente a los métodos de 6 variantes:
- Personaje
toLowerCase
- Personaje
toUpperCase
- Cuerda
toLowerCase
- Cuerda
toUpperCase
- Cuerda
equalsIgnoreCase
- Personaje
toLowerCase(toUpperCase)
(o viceversa)
Para estos métodos, S
significa que las variantes se tratan de la misma manera, D
significa que las variantes se tratan como diferentes entre sí.
Behavior Unicode Glyphs
=========== ================================== =========
1 2 3 4 5 6 Upper Lower Var Up Var Lo Vr Lo2 U L u l l2
- - - - - - ------ ------ ------ ------ ------ - - - - -
D D D D S S u0049 u0069 u0130 u0131 I i İ ı
S D S D S S u004b u006b u212a K k K
D S D S S S u0053 u0073 u017f S s ſ
D S D S S S u039c u03bc u00b5 Μ μ µ
S D S D S S u00c5 u00e5 u212b Å å Å
D S D S S S u0399 u03b9 u0345 u1fbe Ι ι ͅ ι
D S D S S S u0392 u03b2 u03d0 Β β ϐ
D S D S S S u0395 u03b5 u03f5 Ε ε ϵ
D D D D S S u0398 u03b8 u03f4 u03d1 Θ θ ϴ ϑ
D S D S S S u039a u03ba u03f0 Κ κ ϰ
D S D S S S u03a0 u03c0 u03d6 Π π ϖ
D S D S S S u03a1 u03c1 u03f1 Ρ ρ ϱ
D S D S S S u03a3 u03c3 u03c2 Σ σ ς
D S D S S S u03a6 u03c6 u03d5 Φ φ ϕ
S D S D S S u03a9 u03c9 u2126 Ω ω Ω
D S D S S S u1e60 u1e61 u1e9b Ṡ ṡ ẛ
Para complicar esto aún más, no hay forma de acertar con las I turcas (es decir, las versiones con puntos son diferentes a las versiones sin puntos) a menos que sepa que está en turco; ninguno de estos métodos proporciona el comportamiento correcto y no puede hacerlo a menos que conozca la configuración regional (es decir, no turco: i
y I
son el mismo caso ignorando; turco, no).
En general, usando toUpperCase
le da la aproximación más cercana, ya que solo tiene cinco variantes en mayúsculas (o cuatro, sin contar el turco).
También puede intentar interceptar específicamente esos cinco casos problemáticos y llamar toUpperCase(toLowerCase(c))
en ellos solos. Si eliges tus guardias con cuidado (simplemente toUpperCase
Si c < 0x130 || c > 0x212B
luego trabaje con las otras alternativas) puede obtener solo una penalización de velocidad de ~ 20% para los caracteres en el rango bajo (en comparación con ~ 4x si convierte caracteres individuales en cadenas y equalsIgnoreCase
ellos) y solo una penalización de 2x si tienes mucho en la zona de peligro. Todavía tienes el problema de configuración regional con puntos I
, pero por lo demás estás en buena forma. Por supuesto, si puedes usar equalsIgnoreCase
en una más grande stringes mejor que hagas eso.
Aquí hay un código de muestra de Scala que hace el trabajo:
def elevateCase(c: Char): Char = c >= 0x212A)
Character.toUpperCase(Character.toLowerCase(c))
else Character.toUpperCase(c)
Puedes cambiar el caso de String antes de usarlo, así
String name1 = fname.getText().toString().toLowerCase();
String name2 = sname.getText().toString().toLowerCase();
Luego continúe con la operación de reposo.
Valoraciones y comentarios
Si para ti ha resultado de provecho nuestro post, nos gustaría que lo compartas con otros desarrolladores de este modo contrubuyes a dar difusión a esta información.