Bana biraz moji ver


26

Bir dize, karakter listesi bayt akışı, dizi ... Verilen her ikisi de geçerli UTF-8 ve geçerli bir Windows-1252, (dillerin çoğu belki normal UTF-8 dizesi almak isteyecektir) dönüştürmek olduğunu, (dan taklit öyle ) Windows-1252 için UTF-8 .

Walk-through örneği

UTF-8 dizesi
I            UTF-8
, Windows-1252 tablosundaki
49 20E2 99 A520 55 54 46 2D 38
bu bayt değerlerinin bayt olarak temsil edildiği gibi bize Unicode eşdeğerlerini verir .
49 20 E2 2122 A5 20 55 54 46 2D 38

I ⥠UTF-8

Örnekler

£Â£

£Â£

£Â£

I ♥ UTF-8I ♥ UTF-8

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


9
@ user202729 "Dönüştür" bağlantısına bakın. Bu bir püf noktası.
Outgolfer Erik,

5
Kolaylık sağlamak için: Windows 1252 karakter kümesi, karakterlerin olduğu 0x80..0x9F dışında Unicode ile aynıdır € ‚ƒ„…†‡ˆ‰Š‹Œ Ž ‘’“”•–—˜™š›œ žŸ. (alan = kullanılmamış)
user202729

3
@ user202729 Uh, ne söylemeye çalıştığınızdan emin değilim, ancak bu uzaktan gerçek olmaya yakın değil. Unicode milyonlarca karaktere sahiptir, Windows-1252 sadece 256'dır.
David Conrad

1
@DavidConrad, "Unicode'un milyonlarca karakteri var" abartılı. Unicode, 1.114.112 kod noktasını tanımlar. Bunun dışında 136,690 kod noktası şu anda kullanılıyor.
Wernfried Domscheit

1
@Wernfried, bunu bir 256 karakterlik karakter kümesiyle karşılaştırıyor.
David Conrad

Yanıtlar:



19

Java 8, 72 66 36 25 bayt

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

Çevrimiçi deneyin.

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

cp1252bir takma addır Windows-1252. Bu takma ad ve API’lerin cp1252Kanonik Adı , tam ad ise API’nin Kanonik Adıdır . Kodlama için daima en kısa süreyi kullanmak istediğimiz, desteklenen Java kodlamalarının tam listesi için buraya bakın .java.iojava.langWindows-1252java.nio


13
Java kazanan kod golf‽ Bu doğru olamaz.
Adám

1
@ Adám Hehe, tüm bu uzun cevapları görmenin yanı sıra hoş bir şekilde şaşırdım. ;) Ama eminim Jelly, 05AB1E, vs. çok yakında beni yenecek.
Kevin Cruijssen

1
Bundan şüpheliyim. Muhtemelen yerleşik çeviri tabloları yoktur. Dyalog APL yapar…
Ad

" java.nioAPI için Kanonial Adı ": P
yalnızca ASCII

8

R 3.5.0 veya daha yüksek, 32 20 bayt

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

Çevrimiçi deneyin!

R'de bir mücadelesi için oldukça kısa ... JayCe'ye 12 baytlık golf attığı için teşekkürler!

scanisteğe bağlı encodingolarak giriş dizesinin kodlamasını ayarlamak için bir argüman alır . latin1belgelerine göre, karşılık gelirEncoding

'Latin-1' yerel ayarının ne anlama geldiğiyle ilgili bir belirsizlik vardır, çünkü bazı işletim sistemleri (özellikle de Windows) ISO 8859-1 karakter setinde kontrol karakterleri için kullanılan karakter konumlarını kullanır. Bu karakterlerin nasıl yorumlanacağı sisteme bağlıdır, ancak R 3.5.0'dan itibaren, örneğin UTF-8'e dönüştürürken mümkün olan Windows kod sayfası 1252'ye (ki bunlar 'Windows Latin 1 (ANSI)' olarak adlandırır)) yorumlanır.


3
Encoding... belgelendirme bağlantısını takip ettim ve O_O argümanının scanda olduğunu öğrendim encoding... 20 byte
JayCe

@JayCe kim thunk! Çok hoş!
Giuseppe

6

Python 2 , 40 38 bayt

Outgolfer Erik sayesinde -2 bayt .

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

Çevrimiçi deneyin!

u8 için bir takma addır utf-8.


Belki bununla biraz "hile yapabilirsiniz": input().decode(...).encode(...):) Ayrıca powershell'de ise bazı windows konsol kodlamasını kullanabileceğinizi düşünüyorum (ama bu konuda tamamen emin değilim).
KeyWeeUsr


@KeyWeeUsr önerinizle ilgili sorun, bağlantınızdaki cevabın aksine aslında hiçbir şey çıkmamasıdır. R, değilken, çıplak ifadenin değerini çıkarır.
ovs

4

Python 3 , 38 36 34 bayt

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

Çevrimiçi deneyin!

not: Bir çalışma fonksiyonuna sahip olduktan sonra , ovs'nin python2 cevap cevabını tio için başlık ve altbilgi alanları hakkında bilgi almak için kullandım, böylece üstbilgi ve altbilgi aynı

edit: utf8 için varsayılan varsayılan python3 ve ovs'un gönderiminden bir ipucu sayesinde kesilmiş :)


3

JavaScript, 64 bayt

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

Java cevabından bile uzun. Çok üzücü. :(



3

C #, 81 bayt

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

Çevrimiçi deneyin!

3 baytlık Schmalls için teşekkürler


Olması Can using e=System.Text.Encoding;s=>e.GetEncoding(1252).GetString(e.UTF8.GetBytes(s))81 için aşağı alınır?
Schmalls

@Schmalls Evet gibi görünüyor, teşekkürler!
Mego

2

180 bayt, makine kodu (16 bit x86)

Çoğu cevabın yerleşik kodlayıcı / kod çözücüyü kullandığını (ki bunun tamamen iyi olduğuna inanıyorum) fark ettim ama 16-bit görevime devam edeceğimi düşündüm .

Daha öncekilerde olduğu gibi, bu çoğunlukla HT hexeditor ve ICY's hexplorer kullanılarak derleyici olmadan yapıldı .

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  <.r..@...P.....X                  
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

teşrih

Uygulama oldukça ileri düzeyde olsa da, öne doğru akacak kadar düşünmeme rağmen, orada bazı spagetti var.

Takibi biraz daha karıştırıp takip etmeyi kolaylaştırmak için ...

0000 eb40               jmp         0x42

Unicode kodlarla karakterleri eşleyen tablonun üzerinden atlayın> = 0x80 <0xa0.

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

Geçersiz olanlar 0 olarak kodlanmıştır, hiçbir şeyle eşleştirilmezler

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

Karakter yazdırmak için kullanılan yardımcı işlev al, birkaç kez çağrılır.

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         

Kayıtları hazırla. Veriler siyukarıdaki çeviri tablosuna işaret edelim, 0x100 olarak okunacaktır .

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

Stdin'den char oku, EOF ise 0x7d'ye atla.

Sidenote: Bu aslında, 0x7d'nin içerdiği küçük (ama oldukça iyi bilinen) bir numaradır, retbu , başlangıç ​​noktalarında bir segmentin bitmesine neden olur pop sp, orada ve DOS içeriğinde uygulamanın çıkmasına neden olur.sp00 00cs:0CD 20

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

Char <0x80 ise, yalnızca yazdırın ve döngünün başına gidin (yardımcı işlev BX'i 1 - stdout'a ayarladığı için, atlamalar gider 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       

Bu kısım,>> 0xa0 karakterleriyle ilgilidir, ascii kodunu "yüksek" iki bit ve "düşük" 6 bit olarak böler ve utf-8 mask c080'i iki bayt için uygular, sonra ikisini de yazdırır

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       

Bu bölüm chars ile ilgilidir> = 0x80 <0xa0, kodun 0'a eşit olması durumunda, üstteki tabloda uygun utf-8 kodunu bulur, 0x7ff'in altındaysa baştan atla (ergo: iki UTF-8 baytına uyar) , sadece değeri ayarlayın ve önceki kodu 0x166'da tekrar kullanın.

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       

Son kısım, 0x7FF'nin üzerindeki kodlarla ilgilidir, düşük 12 bit düşürür, 0xE0 uygular ( referans için UTF-8 kodlama açıklamasına bakın) ve yazdırın, daha düşük 12 bitleri ayarlayın ve 8080 maskesini uygulayın ve iki karakter ortaya çıkaran parçayı tekrar kullanın .


1

PHP + mbstring , 63 49 bayt

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

Mbstring eksikliği nedeniyle TIO üzerinde çalışmıyor. Üçüncü parametre mbstring'i dizeyi Windows-1252 kodlu olarak yorumlamaya zorlar

Ismael Miguel sayesinde -14 bayt


<?=mb_convert_encoding($argv[1],'UTF8','CP1252');<- daha kısa!
Ismael Miguel,

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.