Dada una cadena, una lista de caracteres, una secuencia de bytes, una secuencia ... que es a la vez UTF-8 válido y Windows-1252 válido (la mayoría de los idiomas probablemente querrán tomar una cadena UTF-8 normal), conviértalo (es decir, suponga que es ) Windows-1252 a UTF-8 .
Ejemplo de recorrido
La cadena UTF-8
I
♥
U
T
F
-
8
se representa como los bytes que
49
20
E2 99 A5
20
55
54
46
2D
38
estos valores de bytes en la tabla Windows-1252 nos dan los equivalentes Unicode
49
20
E2 2122 A5
20
55
54
46
2D
38
que se representan como
I
â
™
¥
U
T
F
-
8
Ejemplos
£
→ £
£
→ £
£
→ £
I ♥ UTF-8
→ I ♥ UTF-8
árvíztűrő tükörfúrógép
→ árvÃztűrÅ‘ tükörfúrógép
€ ‚ƒ„…†‡ˆ‰Š‹Œ Ž ‘’“”•–—˜™š›œ žŸ
. (espacio = sin usar)Respuestas:
bash, 14 bytes
Pruébalo en línea!
fuente
Java 8,
72663625 bytesPruébalo en línea.
cp1252
es un alias paraWindows-1252
. Este aliascp1252
es el nombre canónico para las APIjava.io
yjava.lang
, mientras que el nombre completoWindows-1252
es el nombre canónico para lajava.nio
API. Consulte aquí para obtener una lista completa de codificaciones Java compatibles , donde siempre nos gustaría utilizar la más corta de las dos para codegolfing.fuente
java.nio
API": PR 3.5.0 o superior,
3220 bytesPruébalo en línea!
Curiosamente corto para un desafío de cuerdas en R ... ¡ gracias a JayCe por jugar 12 bytes más!
scan
opcionalmente toma unencoding
argumento para establecer la codificación de la cadena de entrada.latin1
corresponde a, de acuerdo con la documentación deEncoding
fuente
Encoding
... y aprendí quescan
también tiene unencoding
argumento O_O ... 20 bytesPython 2 ,
4038 bytes-2 bytes gracias a Erik the Outgolfer .
Pruébalo en línea!
u8 es un alias para
utf-8
.fuente
input().decode(...).encode(...)
:) también creo que podría usar alguna codificación de consola de Windows si está en powershell (pero no estoy seguro de esto).Python 3 ,
38 3634 bytesPruébalo en línea!
nota: Después de tener una función de trabajo, utilicé la respuesta de respuesta python2 de ovs para conocer los campos de encabezado y pie de página para tio, por lo que el encabezado y el pie de página son los mismos
editar: Lo recorté un poco gracias a que python3 está predeterminado en utf8 y un consejo de la presentación de ovs :)
fuente
JavaScript, 64 bytes
Mostrar fragmento de código
Incluso más tiempo que la respuesta de Java. Muy triste. :(
fuente
Ruby , 31 bytes
Pruébalo en línea!
Los casos de prueba están incluidos en el TIO
fuente
C #, 81 bytes
Pruébalo en línea!
Gracias a Schmalls por 3 bytes.
fuente
using e=System.Text.Encoding;s=>e.GetEncoding(1252).GetString(e.UTF8.GetBytes(s))
bajarlo a 81?180 bytes, código de máquina (16 bits x86)
Noté que la mayoría de las respuestas usan codificación / decodificación integrada (que creo que está perfectamente bien), pero pensé que continuaría mi búsqueda de 16 bits .
Al igual que con los anteriores, esto se hizo sin compilador utilizando principalmente HT hexeditor y ICY's hexplorer .
Disección
La implementación es bastante sencilla, aunque no he pensado demasiado en fluir por adelantado, por lo que hay ALGUNOS espaguetis allí.
Mezclaré un poco el orden, para que sea más fácil de seguir ...
Omita la tabla que asigna caracteres> = 0x80 <0xa0 a códigos unicode.
Los inválidos están codificados como 0, no están asignados a nada
La función auxiliar utilizada para imprimir caracteres
al
se llamará pocas veces.Preparar registros. Los datos se leerán en 0x100, señalemos
si
en la tabla de traducción anterior.Lea char de stdin, salte a 0x7d si EOF.
Nota al margen: en realidad es un truco pequeño (pero bastante conocido), contiene 0x7d
ret
, esto hará quepop sp
,sp
en los puntos de inicio al final de un segmento, esté00 00
allí, ycs:0
en DOS contieneCD 20
, lo que hace que la aplicación salga.Si char es <0x80, simplemente imprímalo y vaya al comienzo del bucle (porque la función auxiliar está configurando BX en 1 - stdout, los saltos irán a
dec bx
)Esta parte se ocupa de los caracteres> = 0xa0, divide el código ASCII en dos bits "altos" y 6 bits "bajos" y aplica la máscara utf-8 c080 para dos bytes, luego imprime ambos
Esta parte trata de caracteres> = 0x80 <0xa0, encuentra el código utf-8 adecuado en la tabla en la parte superior, si el código es igual a 0, salte al principio, si está por debajo de 0x7ff (ergo: cabe en dos bytes UTF-8) , solo ajuste el valor y reutilice el código anterior en 0x166.
Parte final, se ocupa de los códigos que están por encima de 0x7FF, baja 12 bits, aplica 0xE0 (consulte la descripción de codificación UTF-8 para referencia) e imprímalo, ajuste los 12 bits inferiores y aplique la máscara 8080 y vuelva a usar la parte que escupe dos caracteres .
fuente
PHP + mbstring ,
6349 bytes<?=mb_convert_encoding($argv[1],'UTF8','CP1252');
No funciona en TIO debido a la falta de mbstring. El tercer parámetro fuerza a mbstring a interpretar la cadena como Windows-1252 codificada
-14 bytes gracias a Ismael Miguel
fuente
<?=mb_convert_encoding($argv[1],'UTF8','CP1252');
<- incluso más corto!C (gcc) +
libiconv
,119117bytesPruébalo en línea!
fuente