usar touppercase tolowercase sirve que para first ejemplo convert como javascript angularjs unicode internationalization turkish

javascript - sirve - ¿En qué motores JS, específicamente, toLowerCase y toUpperCase son sensibles a la configuración regional?



touppercase javascript (2)

En el código de algunas bibliotecas (por ejemplo, AngularJS , el enlace conduce a las líneas específicas del código), puedo ver que se usan funciones de conversión de casos personalizadas en lugar de las estándar. Se justifica suponiendo que, en los navegadores con configuración regional turca, las funciones estándar no funcionan como se espera:

console.log("SCRIPT".toLowerCase()); // "scrıpt" console.log("script".toUpperCase()); // "SCRİPT"

¿Pero es realmente o fue el caso? ¿Los navegadores realmente se comportan de esta manera? Si es así, ¿cuál de ellos lo hace? ¿Qué pasa con node.js? ¿Otros motores JS?

La existencia de los métodos toLocaleLowerCase y toLocaleUpperCase implica que toLowerCase y toUpperCase son invariantes en el entorno local, ¿no es así?

¿Para qué navegadores, específicamente, el equipo de Angular retiene esta comprobación en el código: if (''i'' !== ''I''.toLowerCase())... ?

Si su navegador (dispositivo) usa la configuración regional turca o azerbaiyana, ejecute este fragmento de código y escríbame si descubre que el problema existe.

if (''i'' !== ''I''.toLowerCase()) { document.write(''Ooops! toLowerCase is locale-sensitive in your browser. '' + ''Please write your user-agent in the comments to this question: '' + navigator.userAgent); } else { document.write(''toLowerCase isn/'t locale-sensitive in your browser. '' + ''Everything works as expected!''); }

<html lang="tr">


Cualquier implementación JS que siga el estándar ECMA-262 5.1 debe implementar String.prototype.toLocaleLowerCase y String.prototype.toLocaleUpperCase

Y según el estándar toLocaleLowerCase se supone que convierte la cadena a su asignación en minúsculas según la asignación específica de la configuración regional.

Cuando toLowerCase convierte en una cadena en minúscula como lo definen las asignaciones de Unicode.

Para la mayoría de los idiomas, toLocaleLowerCase y toLowerCase dan el mismo resultado. Pero para ciertos idiomas, como el turco, el mapeo de casos no sigue el mapeo Unicode, por lo tanto toLowerCase y toLocaleLowerCase dan un resultado diferente.

La Biblioteca / Framework que usa (Jquery, Angular, Node lo que sea) no hace ninguna diferencia en absoluto. Es en la implementación de JS que utiliza para ejecutar sus bibliotecas JS que hace y cambia las cosas.

Para todos los propósitos prácticos, es preciso concluir que Node / Angular o cualquier otra biblioteca y framework de JS se comportan exactamente igual cuando se trata de cadenas (siempre y cuando sean utilizadas por JS Engine que implementa ECMA-262 3 y superior). Dicho esto, estoy seguro de que muchos marcos extienden el objeto de cadena para agregar más funcionalidad, pero las propiedades y funciones básicas definidas por ECMA-262 5.1 siempre existen y se comportarán exactamente igual.

Para obtener más información: http://www.ecma-international.org/ecma-262/5.1/#sec-15.5.4.17

En lo que respecta a los navegadores, todos los navegadores modernos implementan los estándares ECMA-262 5.1 en su motor JS. No estoy seguro acerca de Node, pero por la exposición limitada que tengo con Node, creo que también usan JS implementado según el estándar ECMA-262 5.1.


Nota : Por favor, tenga en cuenta que no pude probarlo!

Según la especificación de ECMAScript :

String.prototype.toLowerCase ()

[...]

Para los propósitos de esta operación, las unidades de código de 16 bits de las Cadenas se tratan como puntos de código en el Plano Multilingüe Básico de Unicode. Los puntos de código sustitutos se transfieren directamente de S a L sin ningún mapeo.

El resultado debe derivarse de acuerdo con las asignaciones de casos en la base de datos de caracteres Unicode (esto incluye explícitamente no solo el archivo UnicodeData.txt, sino también el archivo SpecialCasings.txt que lo acompaña en Unicode 2.1.8 y posterior).

[...]

String.prototype.toLocaleLowerCase ()

Esta función funciona exactamente igual que toLowerCase, excepto que su resultado está destinado a proporcionar el resultado correcto para la configuración regional actual del entorno del host, en lugar de un resultado independiente de la configuración regional. Solo habrá una diferencia en los pocos casos (como el turco) en los que las reglas para ese idioma entran en conflicto con las asignaciones de casos de Unicode normales.

[...]

Y según la Carcasa especial de la base de datos de caracteres Unicode :

[...]

Formato

Las entradas en este archivo están en el siguiente formato legible por máquina:

<code>; <lower>; <title>; <upper>; (<condition_list>;)? # <comment>

Asignaciones incondicionales

[...]

Preservar la equivalencia canónica para I con punto. Turkic se maneja a continuación.

0130; 0069 0307; 0130; 0130; # LATIN CAPITAL LETTER I WITH DOT ABOVE

[...]

Asignaciones sensibles al idioma Estos son caracteres cuyas asignaciones completas de casos dependen del idioma y quizás también del contexto (los caracteres vienen antes o después). Para obtener más información, consulte el encabezado de este archivo y el estándar de Unicode.

lituano

El lituano retiene el punto en una minúscula i cuando está seguido de acentos.

Elimine DOT ABOVE después de "i" con mayúscula o titlecase

0307; 0307; ; ; lt After_Soft_Dotted; # COMBINING DOT ABOVE

Introduzca un punto explícito en la parte superior cuando utilice mayúsculas y letras en mayúsculas cada vez que haya más acentos en la parte superior. (De los acentos utilizados en lituano: grave, aguda, tilde arriba y ogonek)

0049; 0069 0307; 0049; 0049; lt More_Above; # LATIN CAPITAL LETTER I

004A; 006A 0307; 004A; 004A; lt More_Above; # LATIN CAPITAL LETTER J

012E; 012F 0307; 012E; 012E; lt More_Above; # LATIN CAPITAL LETTER I WITH OGONEK

00CC; 0069 0307 0300; 00CC; 00CC; lt; # LATIN CAPITAL LETTER I WITH GRAVE

00CD; 0069 0307 0301; 00CD; 00CD; lt; # LATIN CAPITAL LETTER I WITH ACUTE

0128; 0069 0307 0303; 0128; 0128; lt; #LATIN CAPITAL LETTER I WITH TILDE

Turcos y azeríes

I and i-dotless; I-punto y yo somos pares de casos en turco y azerí. Las siguientes reglas manejan esos casos.

0130; 0069; 0130; 0130; tr; # LATIN CAPITAL LETTER I WITH DOT ABOVE

0130; 0069; 0130; 0130; az; # LATIN CAPITAL LETTER I WITH DOT ABOVE

Al hacer minúsculas, elimine dot_above en la secuencia I + dot_above, que se convertirá en i. Esto coincide con el comportamiento de I-dot_above canónicamente equivalente

0307; ; 0307; 0307; tr After_I; # COMBINING DOT ABOVE

0307; ; 0307; 0307; az After_I; # COMBINING DOT ABOVE

Cuando se escribe una minúscula, a menos que una I esté antes de un dot_above, se convierte en una i sin puntos.

0049; 0131; 0049; 0049; tr Not_Before_Dot; # LATIN CAPITAL LETTER I

0049; 0131; 0049; 0049; az Not_Before_Dot; # LATIN CAPITAL LETTER I

Al hacer mayúsculas, me convierto en un capital punteado.

0069; 0069; 0130; 0130; tr; # LATIN SMALL LETTER I

0069; 0069; 0130; 0130; az; # LATIN SMALL LETTER I

Nota: el siguiente caso ya está en el archivo UnicodeData.txt.

0131; 0131; 0049; 0049; tr; # LATIN SMALL LETTER DOTLESS I

EOF

También, según JavaScript para Absolute Beginners (por Terry McNavage) :

> "I".toLowerCase() // "i" > "i".toUpperCase() // "I" > "I".toLocaleLowerCase() // "<dotless-i>" > "i".toLocaleUpperCase() // "<dotted-I>"

Nota : toLocaleLowerCase() y toLocaleUpperCase() convierten el caso en función de la configuración de su sistema operativo . Tendría que cambiar esa configuración a turco para que la muestra anterior funcione. ¡O simplemente tome mi palabra para ello!

¿Y según el comentario de Bobince sobre Convertir la cadena de JavaScript para que esté en minúsculas? pregunta :

Accept-Language y navigator.language son dos configuraciones completamente separadas. Accept-Language refleja las preferencias elegidas por el usuario para los idiomas que desea recibir en las páginas web (y esta configuración no es accesible para JS). navigator.language simplemente refleja la ubicación del navegador web que se instaló y, por lo general, no debe usarse para nada. Ambos valores no están relacionados con la configuración regional del sistema, que es el bit que decide qué hará toLocaleLowerCase (); eso es una configuración a nivel del sistema operativo fuera del alcance de las preferencias del navegador.

Por lo tanto, establecer lang="tr-TR" en html no reflejará un caso de prueba real, ya que es un ajuste del sistema operativo que se requiere para reproducir el ejemplo de carcasa especial.

Creo que solo el uso de puntos I en minúsculas o de puntos en I sin mayúsculas sería específico de la localidad al usar toLowerCase() o toUpperCase() .

Según esas fuentes creíbles / oficiales, creo que tienes razón: ''i'' !== ''I''.toLowerCase() siempre se evaluaría como falso.

Pero, como dije, no pude probarlo aquí.