Diberikan string, daftar karakter, aliran byte, urutan ... yang keduanya UTF-8 dan Windows-1252 yang valid (sebagian besar bahasa mungkin ingin mengambil string UTF-8 yang normal), mengubahnya dari (yaitu, berpura - pura adalah ) Windows-1252 ke UTF-8 .
Contoh walked-through
String UTF-8
I
♥
U
T
F
-
8
direpresentasikan sebagai
49
20
E2 99 A5
20
55
54
46
2D
38
byte nilai-nilai byte ini dalam tabel Windows-1252 memberi kita ekuivalen Unicode
49
20
E2 2122 A5
20
55
54
46
2D
38
yang dirender sebagai
I
â
™
¥
U
T
F
-
8
Contohnya
£
→ £
£
→ £
£
→ £
I ♥ UTF-8
→ I ♥ UTF-8
árvíztűrő tükörfúrógép
→ árvÃztűrÅ‘ tükörfúrógép
€ ‚ƒ„…†‡ˆ‰Š‹Œ Ž ‘’“”•–—˜™š›œ žŸ
. (spasi = tidak digunakan)Jawaban:
bash, 14 byte
Cobalah online!
sumber
Java 8,
72663625 byteCobalah online.
cp1252
adalah alias untukWindows-1252
. Alias inicp1252
adalah Nama Canonical untukjava.io
danjava.lang
API, sedangkan nama lengkapWindows-1252
adalah Nama Canonical untukjava.nio
API. Lihat di sini untuk daftar lengkap penyandian Java yang didukung , tempat kami selalu ingin menggunakan yang terpendek dari keduanya untuk codegolfing.sumber
java.nio
API": PR 3.5.0 atau lebih tinggi,
3220 byteCobalah online!
Anehnya pendek untuk tantangan string di R ... terima kasih kepada JayCe untuk bermain golf 12 byte lebih banyak!
scan
opsional mengambilencoding
argumen untuk mengatur pengkodean string input.latin1
sesuai dengan, sesuai dengan dokumentasiEncoding
sumber
Encoding
... dan mengetahui bahwa adascan
jugaencoding
argumen O_O ... 20 bytePython 2 ,
4038 byte-2 byte terima kasih kepada Erik the Outgolfer .
Cobalah online!
u8 adalah alias untuk
utf-8
.sumber
input().decode(...).encode(...)
:) juga saya pikir Anda mungkin dapat menggunakan beberapa pengkodean konsol windows jika dalam PowerShell (tapi saya benar-benar tidak yakin tentang ini).Python 3 ,
38 3634 byteCobalah online!
catatan: Setelah saya memiliki fungsi kerja saya menggunakan jawaban python2 jawaban ovs untuk belajar tentang header dan footer field untuk tio, jadi header dan footer adalah sama
sunting: Memangkasnya sedikit berkat python3 default ke utf8 dan tip dari pengiriman ovs :)
sumber
JavaScript, 64 byte
Tampilkan cuplikan kode
Bahkan lebih lama dari jawaban Java. Sangat sedih. :(
sumber
Ruby , 31 byte
Cobalah online!
Kasus-kasus pengujian termasuk dalam TIO
sumber
C #, 81 byte
Cobalah online!
Terima kasih kepada Schmalls untuk 3 byte
sumber
using e=System.Text.Encoding;s=>e.GetEncoding(1252).GetString(e.UTF8.GetBytes(s))
81?180 byte, kode mesin (16-bit x86)
Saya perhatikan sebagian besar jawaban menggunakan builtin encode / decode (yang saya percaya baik-baik saja), tapi saya pikir saya akan melanjutkan pencarian 16-bit saya .
Seperti yang sebelumnya, ini dilakukan tanpa kompiler menggunakan HT hexeditor kebanyakan dan hexplorer ICY .
Pembedahan
Implementasinya cukup mudah, meskipun saya belum banyak berpikir untuk mengalir di muka sehingga ada beberapa spaghetti di sana.
Saya akan mencampur pesanan sedikit, untuk membuatnya lebih mudah diikuti ...
Lewati tabel yang memetakan karakter> = 0x80 <0xa0, ke kode unicode.
Yang tidak valid dikodekan sebagai 0, mereka tidak dipetakan ke apa pun
Fungsi pembantu yang digunakan untuk mencetak char
al
, akan dipanggil beberapa kali.Siapkan register. Data akan dibaca menjadi 0x100, mari kita
si
tunjukkan ke tabel terjemahan di atas.Baca char dari stdin, lompat ke 0x7d jika EOF.
Sidenote: Ini sebenarnya adalah trik kecil (tapi cukup terkenal), berisi 0x7d
ret
, ini akan menyebabkanpop sp
,sp
pada titik awal hingga akhir segmen, ada di00 00
sana, dancs:0
dalam DOS berisiCD 20
, yang menyebabkan aplikasi keluar.Jika char <0x80, cetak saja, dan lanjutkan ke awal loop (karena fungsi helper mengatur BX ke 1 - stdout, lompatan akan ke
dec bx
)Bagian ini membahas karakter chars> = 0xa0, membagi kode ascii menjadi "tinggi" dua bit dan "rendah" 6 bit dan menerapkan utf-8 mask c080 untuk dua byte, lalu mencetak keduanya
Bagian ini berkaitan dengan karakter> = 0x80 <0xa0, ia menemukan kode utf-8 yang sesuai pada tabel di atas, jika kode sama dengan 0, lompati saja ke awal, jika di bawah 0x7ff (ergo: cocok untuk dua byte UTF-8 byte) , sesuaikan nilainya dan gunakan kembali kode sebelumnya pada 0x166.
Bagian terakhir, berurusan dengan kode yang berada di atas 0x7FF, drop rendah 12 bit, terapkan 0xE0 (lihat deskripsi penyandian UTF-8 untuk referensi) dan cetaklah, sesuaikan 12 bit yang lebih rendah dan terapkan 8080 mask dan gunakan kembali bagian yang mengeluarkan dua karakter .
sumber
PHP + mbstring ,
6349 byte<?=mb_convert_encoding($argv[1],'UTF8','CP1252');
Ini tidak berfungsi pada TIO karena kurangnya mbstring. Parameter ketiga memaksa mbstring untuk menafsirkan string sebagai Windows-1252 dikodekan
-14 byte terima kasih kepada Ismael Miguel
sumber
<?=mb_convert_encoding($argv[1],'UTF8','CP1252');
<- bahkan lebih pendek!C (gcc) +
libiconv
,119117 byteCobalah online!
sumber