Nướng cho tôi một ít moji


26

Cho một chuỗi, danh sách nhân vật, dòng byte, chuỗi ... mà là cả hai hợp lệ UTF-8 và hợp lệ của Windows-1252 (hầu hết các ngôn ngữ có lẽ sẽ muốn tham gia một UTF-8 bình thường string), chuyển đổi nó từ (có nghĩa là, giả vờ đó là ) Windows-1252 đến UTF-8 .

Ví dụ đi qua

Chuỗi UTF-8
I            UTF-8
được biểu diễn dưới dạng các byte
49 20E2 99 A520 55 54 46 2D 38
các giá trị byte này trong bảng Windows-1252 cung cấp cho chúng ta các tương đương Unicode
49 20 E2 2122 A5 20 55 54 46 2D 38
, biểu hiện như là
I ⥠UTF-8

Ví dụ

£Â£

£Â£

£Â£

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 Xem liên kết "chuyển đổi nó". Đó là một cách chơi chữ.
Erik the Outgolfer

5
Để thuận tiện: Bộ ký tự Windows 1252 giống như Unicode, ngoại trừ trong 0x80..0x9F, trong đó các ký tự € ‚ƒ„…†‡ˆ‰Š‹Œ Ž ‘’“”•–—˜™š›œ žŸ. (dấu cách = không sử dụng)
user202729

3
@ user202729 Uh, tôi không chắc bạn đang cố nói gì, nhưng điều đó không đúng với sự thật. Unicode có hàng triệu ký tự, Windows-1252 chỉ 256.
David Conrad

1
@DavidConrad, "Unicode có hàng triệu ký tự" được phóng đại. Unicode định nghĩa 1.114.112 điểm mã. Trong số 136.690 điểm mã đó hiện đang được sử dụng.
Wernfried Domscheit

1
@Wernfried quan điểm đang so sánh điều đó với bộ ký tự 256 ký tự.
David Conrad

Câu trả lời:



19

Java 8, 72 66 36 25 byte

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

Hãy thử trực tuyến.

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

cp1252là một bí danh cho Windows-1252. Bí danh cp1252này là Tên Canonical cho java.iojava.langAPI, trong khi tên đầy đủ Windows-1252là Tên Canonical cho java.nioAPI. Xem ở đây để biết danh sách đầy đủ các mã hóa Java được hỗ trợ , nơi chúng tôi luôn muốn sử dụng đoạn mã ngắn nhất trong hai loại để mã hóa.


13
Mã số chiến thắng Java‽ Điều đó không thể đúng.
Adám

1
@ Adám Hehe, tôi thực sự ngạc nhiên khi thấy tất cả những câu trả lời dài hơn này. ;) Nhưng tôi khá chắc chắn Jelly, 05AB1E, v.v. sẽ đánh bại tôi khá sớm.
Kevin Cruijssen

1
Tôi nghi ngờ điều đó. Họ có thể không có bảng dịch tích hợp. Dyalog APL không mặc dù đào
Adám

"Tên Canonial cho java.nioAPI": P
ASCII - chỉ

8

R 3.5.0 trở lên, 32 20 byte

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

Hãy thử trực tuyến!

Thật ngắn gọn cho một thử thách trong R ... cảm ơn JayCe vì đã chơi golf thêm 12 byte!

scantùy ý lấy một encodingđối số để đặt mã hóa của chuỗi đầu vào. latin1tương ứng với, theo các tài liệu củaEncoding

Có một sự mơ hồ về ý nghĩa của ngôn ngữ 'Latin-1', vì một số HĐH (đặc biệt là Windows) sử dụng các vị trí ký tự được sử dụng cho các ký tự điều khiển trong bộ ký tự ISO 8859-1. Làm thế nào các ký tự như vậy được diễn giải phụ thuộc vào hệ thống nhưng từ R 3.5.0, nếu có thể được hiểu theo mã cod 1212 của Windows (mà Microsoft gọi là 'Windows Latin 1 (ANSI)') khi chuyển đổi sang ví dụ UTF-8.


3
Tôi đã theo liên kết đến tài liệu của Encoding... và được biết rằng scancũng có một encodingđối số O_O ... 20 byte
JayCe

@JayCe whoda thunk nó! Rất đẹp!
Giuseppe

6

Python 2 , 40 38 byte

-2 byte nhờ Erik the Outgolfer .

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

Hãy thử trực tuyến!

u8 là một bí danh cho utf-8.


Có lẽ bạn có thể "gian lận" một chút với điều này: input().decode(...).encode(...):) Tôi cũng nghĩ bạn có thể sử dụng một số mã hóa bảng điều khiển windows nếu trong powershell (nhưng tôi hoàn toàn không chắc về điều này).
KeyWeeUsr


@KeyWee Sử dụng vấn đề với đề xuất của bạn là không thực sự xuất ra bất cứ điều gì, trái ngược với câu trả lời bạn đã liên kết. R không xuất giá trị của biểu thức trần trong khi không.
trứng


3

JavaScript, 64 byte

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

Thậm chí dài hơn câu trả lời Java. Buồn quá. :



3

C #, 81 byte

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

Hãy thử trực tuyến!

Cảm ơn Schmalls vì 3 byte


Có thể using e=System.Text.Encoding;s=>e.GetEncoding(1252).GetString(e.UTF8.GetBytes(s))để nó xuống đến 81?
Schmalls

@Schmalls Hình như có, cảm ơn!
Mego

2

180 byte, mã máy (16 bit x86)

Tôi nhận thấy hầu hết các câu trả lời sử dụng mã hóa / giải mã dựng sẵn (mà tôi tin là hoàn toàn tốt), nhưng tôi nghĩ tôi sẽ tiếp tục nhiệm vụ 16 bit của mình .

Như với những người trước đây, điều này đã được thực hiện mà không cần biên dịch sử dụng chủ yếu hexeditor HThexplorer ICY của .

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                                ....                              

nướng.com <input.txt> out.dat

Mổ xẻ

Việc thực hiện khá đơn giản, mặc dù tôi đã không nghĩ nhiều đến việc trả trước vì vậy có MỘT SỐ spaghetti ở đó.

Tôi sẽ trộn thứ tự một chút, để dễ theo dõi hơn ...

0000 eb40               jmp         0x42

Bỏ qua bảng ánh xạ ký tự> = 0x80 <0xa0, để mã unicode.

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

Những cái không hợp lệ được mã hóa thành 0, chúng không được ánh xạ tới bất cứ thứ gì

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

Hàm trợ giúp được sử dụng để in char in al, sẽ được gọi vài lần.

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         

Chuẩn bị sổ đăng ký. Dữ liệu sẽ được đọc vào 0x100, hãy sichỉ vào bảng dịch ở trên.

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

Đọc char từ stdin, nhảy tới 0x7d nếu EOF.

Sidenote: Đây thực sự là một mẹo nhỏ (nhưng khá nổi tiếng), chứa 0x7d ret, điều này sẽ gây ra pop sp, sptại các điểm bắt đầu đến cuối một phân khúc, có 00 00ở đó và cs:0trong DOS chứa CD 20, khiến ứng dụng thoát ra.

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

Nếu char có kích thước <0x80, chỉ cần in ra và đi đến đầu vòng lặp (vì chức năng của trình trợ giúp đang đặt BX thành 1 - thiết bị xuất chuẩn, các bước nhảy sẽ chuyển sang 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       

Phần này xử lý ký tự> = 0xa0, chia mã ascii thành hai bit "cao" và "thấp" 6 bit và áp dụng mặt nạ utf-8 c080 cho hai byte, sau đó in cả hai

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       

Phần này xử lý các ký tự> = 0x80 <0xa0, nó tìm thấy mã utf-8 thích hợp trong bảng ở trên cùng, nếu mã bằng 0, chỉ cần bỏ qua để bắt đầu, nếu nó dưới 0x7ff (ergo: vừa với hai byte UTF-8) , chỉ cần điều chỉnh giá trị và sử dụng lại mã trước đó tại 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       

Phần cuối cùng, xử lý các mã có giá trị trên 0x7FF, giảm 12 bit thấp, áp dụng 0xE0 (xem mô tả mã hóa UTF-8 để tham khảo) và in ra, điều chỉnh 12 bit thấp hơn và áp dụng mặt nạ 8080 và sử dụng lại một phần mà phun ra hai ký tự .


1

PHP + mb chuỗi , 63 49 byte

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

Nó không hoạt động trên TIO do thiếu mbopes. Tham số thứ ba buộc mbopes diễn giải chuỗi dưới dạng Windows-1252 được mã hóa

-14 byte nhờ Ismael Miguel


<?=mb_convert_encoding($argv[1],'UTF8','CP1252');<- thậm chí ngắn hơn!
Ismael Miguel

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.