É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
♥
U
T
F
-
8
est représentée par les octets que
49
20
E2 99 A5
20
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
â
™
¥
U
T
F
-
8
Exemples
£
→ £
£
→ £
£
→ £
I ♥ UTF-8
→ I ♥ UTF-8
árvíztűrő tükörfúrógép
→ árvÃztűrÅ‘ tükörfúrógép
€ ‚ƒ„…†‡ˆ‰Š‹Œ Ž ‘’“”•–—˜™š›œ žŸ
. (espace = inutilisé)Réponses:
bash, 14 octets
Essayez-le en ligne!
la source
Java 8,
72663625 octetsEssayez-le en ligne.
cp1252
est un alias pourWindows-1252
. Cet aliascp1252
est le nom canonique pour les APIjava.io
etjava.lang
, tandis que le nom completWindows-1252
est le nom canonique pour l'java.nio
API. 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.la source
java.nio
API": PR 3.5.0 ou supérieur,
3220 octetsEssayez-le en ligne!
Curieusement court pour un défi de cordes en R ... merci à JayCe pour avoir descendu 12 octets de plus!
scan
prend éventuellement unencoding
argument pour définir le codage de la chaîne d'entrée.latin1
correspond, selon la documentation deEncoding
la source
Encoding
... et j'ai appris qu'ilscan
y a aussi unencoding
argument O_O ... 20 octetsPython 2 ,
4038 octets-2 octets grâce à Erik l'Outgolfer .
Essayez-le en ligne!
u8 est un alias pour
utf-8
.la source
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).Python 3 ,
38 3634 octetsEssayez-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 :)
la source
JavaScript, 64 octets
Afficher l'extrait de code
Encore plus longtemps que la réponse Java. Si triste. :(
la source
Rubis , 31 octets
Essayez-le en ligne!
Les cas de tests sont inclus dans le TIO
la source
C #, 81 octets
Essayez-le en ligne!
Merci à Schmalls pour 3 octets
la source
using e=System.Text.Encoding;s=>e.GetEncoding(1252).GetString(e.UTF8.GetBytes(s))
de le ramener à 81?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 .
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 ...
Ignorez le tableau qui mappe les caractères> = 0x80 <0xa0, aux codes unicode.
Les non valides sont codés comme 0, ils ne sont mappés à rien
La fonction d'aide utilisée pour imprimer les caractères
al
sera appelée plusieurs fois.Préparez les registres. Les données seront lues dans 0x100, pointons
si
dans le tableau de traduction ci-dessus.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 provoquerapop sp
,sp
aux points de départ à la fin d'un segment, il00 00
y en a, etcs:0
dans DOS contientCD 20
, ce qui provoque la fermeture de l'application.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
)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
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.
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 .
la source
PHP + mbstring ,
6349 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
la source
<?=mb_convert_encoding($argv[1],'UTF8','CP1252');
<- encore plus court!C (gcc) +
libiconv
,119117 octetsEssayez-le en ligne!
la source