Faites-moi cuire du moji

26

Étant donné une chaîne, une liste de caractères, un flux d'octets, une séquence… qui est à la fois UTF-8 et Windows-1252 valides (la plupart des langues voudront probablement prendre une chaîne UTF-8 normale), convertissez-la à partir de (c'est-à-dire, faites comme si ) Windows-1252 à UTF-8 .

Exemple guidé

La chaîne UTF-8
I            UTF-8
est représentée par les octets que
49 20E2 99 A520 55 54 46 2D 38
ces valeurs d'octets dans le tableau Windows-1252 nous donnent les équivalents Unicode
49 20 E2 2122 A5 20 55 54 46 2D 38
qui s'affichent comme
I ⥠UTF-8

Exemples

£Â£

£Â£

£Â£

I ♥ UTF-8I ♥ UTF-8

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

Adam
la source
9
@ user202729 Voir le lien "convertir". C'est un jeu de mots.
Erik the Outgolfer
5
Pour plus de commodité: le jeu de caractères Windows 1252 est identique à Unicode, sauf dans 0x80..0x9F, où se trouvent les caractères € ‚ƒ„…†‡ˆ‰Š‹Œ Ž ‘’“”•–—˜™š›œ žŸ. (espace = inutilisé)
user202729
3
@ user202729 Euh, je ne suis pas sûr de ce que vous essayez de dire, mais ce n'est pas du tout vrai. Unicode a des millions de caractères, Windows-1252 seulement 256.
David Conrad
1
@DavidConrad, "Unicode a des millions de caractères" est exagéré. Unicode définit 1 114 112 points de code. Sur ce total, 136 690 points de code sont actuellement utilisés.
Wernfried Domscheit
1
@Wernfried, le point est de comparer cela à un jeu de caractères de 256 caractères.
David Conrad

Réponses:

23

bash, 14 octets

iconv -fCP1252

Essayez-le en ligne!

Poignée de porte
la source
voté, mais si je ne me trompe pas, cela suppose que l'encodage système est utf-8
GiM
19

Java 8, 72 66 36 25 octets

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

Essayez-le en ligne.

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

cp1252est un alias pour Windows-1252. Cet alias cp1252est le nom canonique pour les API java.ioet java.lang, tandis que le nom complet Windows-1252est le nom canonique pour l' java.nioAPI. Voir ici pour une liste complète des encodages Java pris en charge , où nous voudrions toujours utiliser le plus court des deux pour le codegolfing.

Kevin Cruijssen
la source
13
Java gagnant du code golf‽ Cela ne peut pas être vrai.
Adám
1
@ Adám Hehe, je suis également agréablement surpris de voir toutes ces réponses plus longues. ;) Mais je suis presque sûr que Jelly, 05AB1E, etc. me battra très bientôt.
Kevin Cruijssen
1
Je doute que. Ils n'ont probablement pas de tables de traduction intégrées. Dyalog APL fait cependant…
Adám
"Nom Canonial pour l' java.nioAPI": P
ASCII uniquement
8

R 3.5.0 ou supérieur, 32 20 octets

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

Essayez-le en ligne!

Curieusement court pour un défi de en R ... merci à JayCe pour avoir descendu 12 octets de plus!

scanprend éventuellement un encodingargument pour définir le codage de la chaîne d'entrée. latin1correspond, selon la documentation deEncoding

Il y a une certaine ambiguïté quant à ce que l'on entend par paramètres régionaux «Latin-1», car certains systèmes d'exploitation (notamment Windows) utilisent les positions de caractères utilisées pour les caractères de contrôle dans le jeu de caractères ISO 8859-1. La façon dont ces caractères sont interprétés dépend du système, mais à partir de R 3.5.0, ils sont si possible interprétés selon la page de codes Windows 1252 (que Microsoft appelle `` Windows Latin 1 (ANSI) '') lors de la conversion par exemple en UTF-8.

Giuseppe
la source
3
J'ai suivi le lien vers la documentation de Encoding... et j'ai appris qu'il scany a aussi un encodingargument O_O ... 20 octets
JayCe
@JayCe whoda thunk it! Très agréable!
Giuseppe
6

Python 2 , 40 38 octets

-2 octets grâce à Erik l'Outgolfer .

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

Essayez-le en ligne!

u8 est un alias pour utf-8.

ovs
la source
Peut-être pourriez-vous "tricher" un peu avec ceci: input().decode(...).encode(...):) aussi je pense que vous pourriez être en mesure d'utiliser un encodage de console Windows si en PowerShell (mais je ne suis absolument pas sûr de cela).
KeyWeeUsr
@KeyWeeUsr le problème avec votre suggestion est qu'elle ne génère rien, contrairement à la réponse que vous avez liée. R ne produit pas la valeur de l'expression nue tandis que non.
OVS
4

Python 3 , 38 36 34 octets

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

Essayez-le en ligne!

note: Après avoir eu une fonction de travail, j'ai utilisé la réponse réponse python2 d'ovs pour en savoir plus sur les champs d'en-tête et de pied de page pour tio, donc l'en-tête et le pied de page sont les mêmes

edit: l'ajusté un peu grâce à python3 par défaut sur utf8 et un conseil de la soumission d'ovs :)

GammaGames
la source
3

JavaScript, 64 octets

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

Encore plus longtemps que la réponse Java. Si triste. :(

tsh
la source
3

C #, 81 octets

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

Essayez-le en ligne!

Merci à Schmalls pour 3 octets

Mego
la source
Est-ce possible using e=System.Text.Encoding;s=>e.GetEncoding(1252).GetString(e.UTF8.GetBytes(s))de le ramener à 81?
Schmalls
@Schmalls On dirait que oui, merci!
Mego
2

180 octets, code machine (16 bits x86)

J'ai remarqué que la plupart des réponses utilisent l'encodage / décodage intégré (ce qui, je pense, est très bien), mais j'ai pensé que je continuerais ma quête 16 bits .

Comme pour les précédents, cela a été fait sans compilateur utilisant principalement HT hexeditor et 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

Dissection

La mise en œuvre est assez simple, même si je n'ai pas beaucoup réfléchi à l'avance, il y a donc QUELQUES spaghettis.

Je vais mélanger un peu l'ordre, pour le rendre plus facile à suivre ...

0000 eb40               jmp         0x42

Ignorez le tableau qui mappe les caractères> = 0x80 <0xa0, aux codes unicode.

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

Les non valides sont codés comme 0, ils ne sont mappés à rien

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

La fonction d'aide utilisée pour imprimer les caractères alsera appelée plusieurs fois.

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         

Préparez les registres. Les données seront lues dans 0x100, pointons sidans le tableau de traduction ci-dessus.

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

Lisez le caractère de stdin, passez à 0x7d si EOF.

Sidenote: Il s'agit en fait d'une petite astuce (mais assez bien connue), contient 0x7d ret, cela provoquera pop sp, spaux points de départ à la fin d'un segment, il 00 00y en a, et cs:0dans DOS contient CD 20, ce qui provoque la fermeture de l'application.

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

Si char est <0x80, il suffit de l'imprimer et d'aller au début de la boucle (parce que la fonction d'assistance met BX à 1 - stdout, les sauts iront à 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       

Cette partie traite des caractères> = 0xa0, divise le code ascii en deux bits "haut" et 6 bits "bas" et applique le masque utf-8 c080 pendant deux octets, puis les imprime tous les deux

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       

Cette partie traite des caractères> = 0x80 <0xa0, elle trouve le code utf-8 approprié dans le tableau en haut, si le code est égal à 0, passez simplement au début, s'il est inférieur à 0x7ff (ergo: tient sur deux octets UTF-8) , ajustez simplement la valeur et réutilisez le code précédent à 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       

La dernière partie traite des codes supérieurs à 0x7FF, supprime les 12 bits bas, applique 0xE0 (voir la description du codage UTF-8 pour référence) et l'imprime, ajuste les 12 bits inférieurs et applique le masque 8080 et réutilise à nouveau la partie qui crache deux caractères .

GiM
la source
1

PHP + mbstring , 63 49 octets

<?=mb_convert_encoding($argv[1],'UTF8','CP1252');

Cela ne fonctionne pas sur TIO en raison du manque de mbstring. Le troisième paramètre force mbstring à interpréter la chaîne comme codée Windows-1252

-14 octets grâce à Ismael Miguel

Sefa
la source
<?=mb_convert_encoding($argv[1],'UTF8','CP1252');<- encore plus court!
Ismael Miguel
0

C (gcc) + libiconv, 119 117 octets

*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;}

Essayez-le en ligne!

ErikF
la source
Vous devez changer la langue en "C (gcc) + libiconv" dans ce cas
ASCII uniquement
103 octets
plafondcat