Biorąc pod uwagę ciąg znaków, listę znaków, strumień bajtów, sekwencję… która jest zarówno poprawnym UTF-8, jak i prawidłowym Windows-1252 (większość języków prawdopodobnie będzie chciała wziąć normalny ciąg UTF-8), przekonwertuj go (to znaczy udawaj , że jest ) Windows-1252 do UTF-8 .
Przykład przejścia
Ciąg UTF-8
I
♥
U
T
F
-
8
jest reprezentowany jako bajty.
49
20
E2 99 A5
20
55
54
46
2D
38
Te wartości bajtów w tabeli Windows-1252 dają nam odpowiedniki Unicode,
49
20
E2 2122 A5
20
55
54
46
2D
38
które są renderowane jako
I
â
™
¥
U
T
F
-
8
Przykłady
£
→ £
£
→ £
£
→ £
I ♥ UTF-8
→ I ♥ UTF-8
árvíztűrő tükörfúrógép
→ árvÃztűrÅ‘ tükörfúrógép
€ ‚ƒ„…†‡ˆ‰Š‹Œ Ž ‘’“”•–—˜™š›œ žŸ
. (spacja = nieużywane)Odpowiedzi:
bash, 14 bajtów
Wypróbuj online!
źródło
Java 8,
72663625 bajtówWypróbuj online.
cp1252
jest pseudonimem dlaWindows-1252
. Ten aliascp1252
to nazwa kanoniczna dla interfejsów APIjava.io
ijava.lang
, natomiast pełna nazwaWindows-1252
to nazwa kanoniczna dlajava.nio
interfejsu API. Zobacz tutaj pełną listę obsługiwanych kodowań Java , w których zawsze chcielibyśmy używać najkrótszego z nich do kodowania.źródło
java.nio
interfejsu API”: PR 3.5.0 lub wyższy,
3220 bajtówWypróbuj online!
Dziwnie krótki na wyzwanie strunowe w R ... dzięki JayCe za grę w golfa jeszcze 12 bajtów!
scan
opcjonalnie przyjmujeencoding
argument, aby ustawić kodowanie ciągu wejściowego.latin1
odpowiada, zgodnie z dokumentacjąEncoding
źródło
Encoding
... i dowiedziałem się, żescan
ma równieżencoding
argument O_O ... 20 bajtówPython 2 ,
4038 bajtów-2 bajty dzięki Erikowi Outgolfer .
Wypróbuj online!
u8 to pseudonim
utf-8
.źródło
input().decode(...).encode(...)
:) również myślę, że możesz być w stanie użyć kodowania konsoli Windows, jeśli jest w PowerShell (ale nie jestem tego pewien).Python 3 ,
38 3634 bajtówWypróbuj online!
Uwaga: po uruchomieniu funkcji użyłem odpowiedzi ovhon python2, aby dowiedzieć się o polach nagłówka i stopki dla tio, więc nagłówek i stopka są takie same
edit: Trochę go skróciłem dzięki domyślnemu python3 dla utf8 i wskazówce z przesłania ovsa :)
źródło
JavaScript, 64 bajty
Pokaż fragment kodu
Nawet dłużej niż odpowiedź Java. Taki smutny. :(
źródło
Ruby , 31 bajtów
Wypróbuj online!
Przypadki testowe są zawarte w TIO
źródło
C #, 81 bajtów
Wypróbuj online!
Dzięki Schmalls za 3 bajty
źródło
using e=System.Text.Encoding;s=>e.GetEncoding(1252).GetString(e.UTF8.GetBytes(s))
się zmniejszyć do 81?180 bajtów, kod maszynowy (16-bit x86)
Zauważyłem, że większość odpowiedzi używa wbudowanego kodowania / dekodowania (co moim zdaniem jest w porządku), ale pomyślałem, że będę kontynuować moją 16-bitową misję .
Podobnie jak w poprzednich, zostało to zrobione bez kompilatora przy użyciu głównie heksitora HT i heksplorera ICY .
Sekcja
Wdrożenie jest dość proste, chociaż nie zastanawiałem się nad tym, aby wypłynąć z góry, więc jest tam NIEKTÓRE spaghetti.
Zmiksuję trochę zamówienie, aby ułatwić śledzenie ...
Pomiń tabelę, która mapuje znaki> = 0x80 <0xa0, na kody Unicode.
Nieprawidłowe są zakodowane jako 0, nie są odwzorowane na nic
Funkcja pomocnicza użyta do wydrukowania znaku
al
będzie wywoływana kilka razy.Przygotuj rejestry. Dane zostaną wczytane do 0x100, niech
si
punkt w tabeli translacji powyżej.Odczytaj char ze standardowego wejścia, przeskocz do 0x7d, jeśli EOF.
Sidenote: To rzeczywiście jest niewielka (ale dość dobrze znana) trik, 0x7D zawiera
ret
, spowoduje topop sp
,sp
w punktach początku do końca odcinka, nie00 00
istnieje, acs:0
w DOS zawieraCD 20
, co powoduje, że wniosek do wyjścia.Jeśli char jest <0x80, po prostu wydrukuj go i przejdź do początku pętli (ponieważ funkcja pomocnika ustawia BX na 1 - standardowe wyjście, skoki przejdą do
dec bx
)Ta część dotyczy znaków> = 0xa0, dzieli kod ascii na „wysoki” dwa bity i „niski” 6 bitów i stosuje maskę utf-8 c080 dla dwóch bajtów, a następnie drukuje oba z nich
Ta część dotyczy znaków> = 0x80 <0xa0, znajduje odpowiedni kod utf-8 w tabeli u góry, jeśli kod jest równy 0, po prostu przejdź do początku, jeśli jest poniżej 0x7ff (ergo: pasuje do dwóch bajtów UTF-8) , po prostu dostosuj wartość i ponownie użyj poprzedniego kodu o wartości 0x166.
Ostatnia część dotyczy kodów powyżej 0x7FF, upuszcza 12 bitów, stosuje 0xE0 (patrz opis kodowania UTF-8 w celach informacyjnych) i drukuje, dostosowuje 12 bitów i stosuje maskę 8080 i ponownie wykorzystuje część, która wyrzuca dwa znaki .
źródło
PHP + mbstring ,
6349 bajtów<?=mb_convert_encoding($argv[1],'UTF8','CP1252');
Nie działa na TIO z powodu braku mbstring. Trzeci parametr zmusza mbstring do interpretacji ciągu jako zakodowanego w Windows-1252
-14 bajtów dzięki Ismaelowi Miguelowi
źródło
<?=mb_convert_encoding($argv[1],'UTF8','CP1252');
<- jeszcze krótszy!C (gcc) +
libiconv
,119117 bajtówWypróbuj online!
źródło