Quiero escribir mi propia función toUpperCase para JavaScript sin usar bibliotecas. ¿Cómo puedo hacer eso?

Una forma típica de convertir a mayúsculas es usar una operación bit a bit para borrar el bit de mayúsculas a 0. Aquí está mi línea para convertir un carácter a mayúsculas.

chr = ‘a’;
String.fromCharCode (chr.charCodeAt (0) & 223); // => ‘A’

En ASCII, el sexto bit indica si es mayúscula o minúscula. Por lo tanto, si usamos una operación bit a bit para establecer el sexto bit en 0, se convertirá a mayúsculas.

Aquí está la función toUpperCase que desea:

var myToUpperCase = función (str) {
var ret = “”;
para (i = 0; i <longitud de str; i ++) {
ret + = String.fromCharCode (str.charCodeAt (i) & 223);
}
volver ret;
}

Ahora echemos un vistazo a esta solución.

¿Por qué y 223?

Para entender esta frase, primero debe saber cómo se codifican los caracteres. Aquí hay algunos caracteres en decimal ASCII:

‘a’: 97 – ‘A’: 65;
‘b’: 98 – ‘B’: 66;
‘c’: 99 – ‘C’: 67;

Ves el patrón aquí. En ASCII, la mayúscula es simplemente 32 DEC (o 20 HEX) menos que su minúscula. Por lo tanto, para convertir un carácter a mayúsculas, ¿no podemos simplemente convertirlo a su código ASCII, restar 32 y volver a convertirlo en un carácter?

Sí tu puedes. Intentemos esto:

String.fromCharCode (chr.charCodeAt (0) – 32);

Como puede ver, ‘- 32’ también funcionará en este carácter simple. Sin embargo, si tiene una cadena más compleja con letras mezcladas con números y símbolos, ¿seguirá funcionando?

Probemos con la cadena “Chen_Yumin”, con ‘- 32’ para cada carácter, el resultado es “‘ #HEN? 9UMIN’ “. Entonces, ¿qué salió mal?

El problema con ‘- 32’ es: no funciona con letras mayúsculas, números y símbolos. El carácter ‘C’, por ejemplo, ya está en mayúscula (67 DEC), si resta 32, se convertirá en ‘#’ (35 DEC).

Para que funcione con letras mayúsculas, números y símbolos. Tienes que echar un vistazo a la representación binaria.

‘a’: 1 1 00001 – ‘A’: 1 0 00001;
‘b’: 1 1 00010 – ‘B’: 1 0 00010;
‘c’: 1 1 00011 – ‘C’: 1 0 00011;

¿Ves el patrón aquí? La única diferencia aquí es el sexto bit. Este bit define si una letra es mayúscula o no. Por lo tanto, podemos simplemente establecer el sexto bit en 0.

Para hacer esto, necesitaríamos usar operaciones de bit. Si realizamos la operación AND en la letra minúscula con 11011111, esto establecerá el 6to bit en 0 mientras retendremos el resto de los bits.

Por lo tanto, la solución se convierte en ‘& b11011111’. JavaScript no admite binario directo como entrada de valor, por lo que primero tendríamos que convertir ‘b11011111’ a decimal, que se convierte en nuestra respuesta ‘& 223’.

Si desea obtener más información sobre esto, he escrito una publicación de blog sobre esto: Cómo usar operaciones bit a bit en JavaScript para convertir una cadena a mayúsculas.

La respuesta de Chen Yumin cubre ASCII y funciona también para Latin-1. Esto es lo suficientemente bueno para el inglés y algunos otros idiomas de Europa occidental. ¿Pero qué hay del griego y el ruso?

Si desea preocuparse por otros idiomas además del inglés, probablemente usaría Unicode. Implementar toUpperCase para Unicode no es solo cambiar un poco. En realidad, la mejor manera es realizar una búsqueda de tabla basada en los datos del Estándar Unicode.

Necesita los datos y la explicación de los campos. Puede ver que para toUpperCase () solo necesita buscar el duodécimo campo en la lista. Esto le proporciona la asignación de un carácter simple independiente del idioma de minúsculas a mayúsculas.

¿Suficientemente bueno?

Bueno, todavía hay letras que son problemáticas. Hasta hace poco, el eszett alemán (o S agudo) ‘ß’ no tenía una representación mayúscula de un solo carácter. En cambio, lo traducirías a ‘SS’ (creo).

Y luego está el turco …

… sabes cuál es la mayúscula de ‘i’? Bueno, en Turquía se supone que es ‘İ’ (que es una letra mayúscula I, pero con un punto).

No sé cómo hacerlo sin bibliotecas, pero sí cómo hacerlo con bibliotecas. Buena suerte sin embargo.

función toUpperCaseFunction (stringParameter)

{

var arrayString = stringParameter.split (”); // divide la cadena en una matriz

for (var i = 0; i

{

arrayString [i] = arrayString [i] .toUpperCase (); // convierte cada letra en mayúscula

}

var finalString = arrayString.join (”); // unirse a la matriz

return finalString; // devuelve la cadena

}

Si solo está usando caracteres ASCII, es una línea, consulte los códigos de caracteres ASCII y la conversión de gráficos html, octal, hexadecimal y decimal y vea si puede resolverlo.