Horneame un poco de moji

26

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            UTF-8
se representa como los bytes que
49 20E2 99 A520 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 ⥠UTF-8

Ejemplos

£Â£

£Â£

£Â£

I ♥ UTF-8I ♥ UTF-8

árvíztűrő tükörfúrógépárvÃztűrÅ‘ tükörfúrógép

Adán
fuente
99
@ user202729 Vea el enlace "convertirlo". Es un juego de palabras.
Erik the Outgolfer
55
Por conveniencia: el conjunto de caracteres de Windows 1252 es el mismo que Unicode, excepto en 0x80..0x9F, donde están los caracteres € ‚ƒ„…†‡ˆ‰Š‹Œ Ž ‘’“”•–—˜™š›œ žŸ. (espacio = sin usar)
usuario202729
3
@ user202729 Uh, no estoy seguro de lo que intentabas decir, pero eso no es ni remotamente cierto. Unicode tiene millones de caracteres, Windows-1252 solo 256.
David Conrad
1
@DavidConrad, "Unicode tiene millones de caracteres" es exagerado. Unicode define 1.114.112 puntos de código. Fuera de eso, 136,690 puntos de código se utilizan actualmente.
Wernfried Domscheit
1
@Wernfried el punto es comparar eso con un juego de caracteres de 256 caracteres.
David Conrad

Respuestas:

23

bash, 14 bytes

iconv -fCP1252

Pruébalo en línea!

Pomo de la puerta
fuente
votó a favor, pero si no me equivoco, eso supone, que la codificación del sistema es utf-8
GiM
19

Java 8, 72 66 36 25 bytes

s->new String(s,"cp1252")

Pruébalo en línea.

s->  // Method with byte-array (UTF-8 by default) as parameter and String return-type
  new String(s,"cp1252")
     //  Pretend this UTF-8 input is (and convert it to) Windows-1252,
     //  and return it as UTF-8 String (by default) as well

cp1252es un alias para Windows-1252. Este alias cp1252es el nombre canónico para las API java.ioy java.lang, mientras que el nombre completo Windows-1252es el nombre canónico para la java.nioAPI. 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.

Kevin Cruijssen
fuente
13
Golf ganador de código Java‽ Eso no puede ser correcto.
Adám
1
@ Adám Hehe, también estoy gratamente sorprendido de ver todas estas respuestas más largas. ;) Pero estoy bastante seguro de que Jelly, 05AB1E, etc. me vencerán muy pronto.
Kevin Cruijssen
1
Dudo que. Probablemente no tengan tablas de traducción incorporadas. Sin embargo, Dyalog APL sí ...
Adám
"Nombre canónico para la java.nioAPI": P
Solo ASCII
8

R 3.5.0 o superior, 32 20 bytes

scan(,"",e="latin1")

Pruébalo en línea!

Curiosamente corto para un desafío de en R ... ¡ gracias a JayCe por jugar 12 bytes más!

scanopcionalmente toma un encodingargumento para establecer la codificación de la cadena de entrada. latin1corresponde a, de acuerdo con la documentación deEncoding

Existe cierta ambigüedad en cuanto a lo que se entiende por una configuración regional 'Latin-1', ya que algunos sistemas operativos (especialmente Windows) hacen uso de las posiciones de caracteres utilizadas para los caracteres de control en el conjunto de caracteres ISO 8859-1. La forma en que se interpretan dichos caracteres depende del sistema, pero a partir de R 3.5.0, si es posible, se interpretan según la página de códigos de Windows 1252 (que Microsoft llama 'Windows Latin 1 (ANSI)') al convertir, por ejemplo, a UTF-8.

Giuseppe
fuente
3
Seguí el enlace a la documentación de Encoding... y aprendí quescan también tiene un encodingargumento O_O ... 20 bytes
JayCe
¡@JayCe whoda lo golpeó! ¡Muy agradable!
Giuseppe
6

Python 2 , 40 38 bytes

-2 bytes gracias a Erik the Outgolfer .

lambda s:s.decode('1252').encode('u8')

Pruébalo en línea!

u8 es un alias para utf-8.

ovs
fuente
Quizás podría "engañar" un poco con esto: 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).
KeyWeeUsr
@KeyWeeUsr el problema con su sugerencia es que en realidad no genera nada, a diferencia de la respuesta que ha vinculado. R genera el valor de la expresión desnuda mientras que no.
ovs
4

Python 3 , 38 36 34 bytes

lambda s:s.encode().decode('1252')

Prué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 :)

GammaGames
fuente
3

JavaScript, 64 bytes

x=>new TextDecoder('cp1252').decode(new TextEncoder().encode(x))

Incluso más tiempo que la respuesta de Java. Muy triste. :(

tsh
fuente
3

C #, 81 bytes

using e=System.Text.Encoding;s=>e.GetEncoding(1252).GetString(e.UTF8.GetBytes(s))

Pruébalo en línea!

Gracias a Schmalls por 3 bytes.

Mego
fuente
¿Puede ser using e=System.Text.Encoding;s=>e.GetEncoding(1252).GetString(e.UTF8.GetBytes(s))bajarlo a 81?
Schmalls
@Schmalls Parece que sí, ¡gracias!
Mego
2

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 .

00000000: eb40 ac20 0000 1a20 9201 1e20 2620 2020  .@. ... ... &                     
00000010: 2120 c602 3020 6001 3920 5201 0000 7d01  ! ..0 `.9 R...}.                  
00000020: 0000 0000 1820 1920 1c20 1d20 2220 1320  ..... . . . " .                   
00000030: 1420 dc02 2221 6101 3a20 5301 0000 7e01  . .."!a.: S...~.                  
00000040: 7801 89f7 4646 89fa 89d9 4143 4bb4 3fcd  x...FF....ACK.?.                  
00000050: 2185 c074 288a 053c 8073 05e8 1700 ebec  !..t(..<.s......                  
00000060: 3ca0 721a d440 0d80 c050 86c4 e806 0058  <[email protected]                  
00000070: e802 00eb d7b4 4088 05b3 01cd 21c3 2c80  ......@.....!.,.                  
00000080: d0e0 89c3 8b00 89cb 85c0 74c0 3dff 0773  ..........t.=..s                  
00000090: 08c1 c002 c0e8 02eb cd50 c1e8 0c0c e0e8  .........P......                  
000000a0: d3ff 5825 ff0f c1c0 02c0 e802 0d80 8050  ..X%...........P                  
000000b0: 86c4 ebb8                                ....                              

bake.com <input.txt> out.dat

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 ...

0000 eb40               jmp         0x42

Omita la tabla que asigna caracteres> = 0x80 <0xa0 a códigos unicode.

data db ACh,20h, 00h,00h, 1Ah,20h, ...

Los inválidos están codificados como 0, no están asignados a nada

0075 b440               mov         ah, 0x40   
0077 8805               mov         [di], al   
0079 b301               mov         bl, 0x1    
007b cd21               int         0x21       
007d c3                 ret                    

La función auxiliar utilizada para imprimir caracteres alse llamará pocas veces.

0042 89f7               mov         di, si     
0044 46                 inc         si         
0045 46                 inc         si         
0046 89fa               mov         dx, di     
0048 89d9               mov         cx, bx     
004a 41                 inc         cx         
004b 43                 inc         bx         

Preparar registros. Los datos se leerán en 0x100, señalemos sien la tabla de traducción anterior.

004c 4b                 dec         bx         
004d b43f               mov         ah, 0x3f   
004f cd21               int         0x21       
0051 85c0               test        ax, ax     
0053 7428               jz          0x7d       

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á que pop sp, spen los puntos de inicio al final de un segmento, esté 00 00allí, y cs:0en DOS contiene CD 20, lo que hace que la aplicación salga.

0055 8a05               mov         al, [di]   
0057 3c80               cmp         al, 0x80   
0059 7305               jnc         0x60       
005b e81700             call        0x75       
005e ebec               jmp         0x4c       

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)

0060 3ca0               cmp         al, 0xa0   
0062 721a               jc          0x7e       
0064 d440               aam         0x40       
0066 0d80c0             or          ax, c080   
0069 50                 push        ax         
006a 86c4               xchg        ah, al     
006c e80600             call        0x75       
006f 58                 pop         ax         
0070 e80200             call        0x75       
0073 ebd7               jmp         0x4c       

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

007e 2c80               sub         al, 0x80   
0080 d0e0               shl         al, 0x1    
0082 89c3               mov         bx, ax     
0084 8b00               mov         ax, [bx+si]
0086 89cb               mov         bx, cx     
0088 85c0               test        ax, ax     
008a 74c0               jz          0x4c       
008c 3dff07             cmp         ax, 07ff   
008f 7308               jnc         0x99       
0091 c1c002             rol         ax, 0x2    
0094 c0e802             shr         al, 0x2    
0097 ebcd               jmp         0x66       

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.

0099 50                 push        ax         
009a c1e80c             shr         ax, 0xc    
009d 0ce0               or          al, e0     
009f e8d3ff             call        0x75       
00a2 58                 pop         ax         
00a3 25ff0f             and         ax, 0fff   
00a6 c1c002             rol         ax, 0x2    
00a9 c0e802             shr         al, 0x2    
00ac 0d8080             or          ax, 8080   
00af 50                 push        ax         
00b0 86c4               xchg        ah, al     
00b2 ebb8               jmp         0x6c       

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 .

GiM
fuente
1

PHP + mbstring , 63 49 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

Sefa
fuente
<?=mb_convert_encoding($argv[1],'UTF8','CP1252');<- incluso más corto!
Ismael Miguel
0

C (gcc) + libiconv, 119117 bytes

*f(s,t,u)void*s,*t,*u;{long i=strlen(s),j=i*4;u=t=malloc(j);iconv(iconv_open("UTF8","CP1252"),&s,&i,&u,&j);return t;}

Pruébalo en línea!

ErikF
fuente
Debería cambiar el idioma a "C (gcc) + libiconv" en este caso
solo ASCII
103 bytes
ceilingcat