Tengo una cadena que sé con certeza que solo tiene letras ASCII . JS trata las cadenas como UTF-8 de forma predeterminada, lo que significa que cada carácter ocupa hasta 4 bytes, que es 4 veces ASCII.
Estoy tratando de comprimir / ahorrar espacios / obtener la cadena más corta posible , al tener funciones de encode y decode .
Pensé en representar 4 caracteres de ASCII en una cadena UTF-8 y así lograr mis objetivos, ¿hay algo así? 
Si no, ¿cuál es la mejor manera de comprimir cadenas ASCII , de modo que al codificar y decodificar llegue a la misma cadena?
En realidad, JavaScript codifica cadenas de programa en UTF-16, que utiliza 2 octetos (16 bits) para caracteres Unicode en BMP (Basic Multilingual Plane) y 4 octetos (32 bits) para caracteres fuera de él. Entonces, al menos internamente, los caracteres ASCII usan 2 bytes.
Hay espacio para empaquetar dos caracteres ASCII en 16 bits, ya que solo usan 7 bits cada uno. Además, dado que la diferencia entre 2**16 y 2**14 es 49152 , y la cantidad de codificaciones utilizadas por los pares sustitutos en UTF-16 es ( supuestamente ) 2048 , debería poder diseñar un esquema de codificación que evite el rango de puntos de código utilizados por sustitutos.
También puede usar matrices tipadas de 8 bits para contener caracteres ASCII y evitar la complejidad de un algoritmo de compresión personalizado.
El propósito de comprimir ASCII de 7 bits para su uso dentro de JavaScript es en gran parte (¿totalmente?) académico en estos días y no es algo para lo que haya demanda. Tenga en cuenta que la codificación de contenido ASCII de 7 bits en UTF-8 (para transmisión o codificación de archivos) solo utiliza un byte para caracteres ASCII debido al diseño de UTF-8.