อบ moji ให้ฉันหน่อย


26

รับสตริงรายการตัวอักษรไบต์สตรีมลำดับ ... ซึ่งเป็นทั้ง UTF-8 ที่ถูกต้องและ Windows-1252 ที่ถูกต้อง (ภาษาส่วนใหญ่อาจต้องการใช้สตริง UTF-8 ปกติ) แปลงจาก (นั่นคือทำเป็นว่ามันคือ ) Windows-1252ถึงUTF-8 UTF-8

ตัวอย่างแบบ walk-through

สตริง UTF-8
I            UTF-8
แสดงเป็นไบต์
49 20E2 99 A520 55 54 46 2D 38
ค่าไบต์เหล่านี้ในตาราง Windows-1252ทำให้เรามี Unicode ที่เทียบเท่า
49 20 E2 2122 A5 20 55 54 46 2D 38
ซึ่งแสดงผลเป็น
I ⥠UTF-8

ตัวอย่าง

£Â£

£Â£

£Â£

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 ดูลิงก์ "แปลงเป็น" มันเป็นปุน
Erik the Outgolfer

5
เพื่อความสะดวก: ของ Windows 1252 ชุดอักขระเป็นเช่นเดียวกับ Unicode ยกเว้นใน 0x80..0x9F € ‚ƒ„…†‡ˆ‰Š‹Œ Ž ‘’“”•–—˜™š›œ žŸที่ตัวละคร (space = ไม่ได้ใช้)
user202729

3
@ user202729 เอ่อฉันไม่แน่ใจว่าคุณพยายามพูดอะไร แต่นั่นก็ไม่ใกล้เคียงกับความเป็นจริง Unicode มีอักขระนับล้านตัว Windows-1252 เท่านั้น 256
David Conrad

1
@DavidConrad "Unicode มีตัวอักษรนับล้าน" เกินจริง Unicode กำหนด codepoints 1,114,112 ปัจจุบันมีการใช้ codepoints 136,690 ตัว
Wernfried Domscheit

1
@ Wernfried จุดกำลังเปรียบเทียบกับชุดอักขระ 256 ตัว
David Conrad

คำตอบ:



19

Java 8, 72 66 36 25 ไบต์

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

ลองออนไลน์

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

cp1252Windows-1252เป็นนามแฝงสำหรับ นามแฝงนี้cp1252เป็นชื่อ Canonical สำหรับjava.ioและjava.langAPI ในขณะที่ชื่อเต็มWindows-1252คือชื่อ Canonical สำหรับjava.nioAPI ดูที่นี่สำหรับรายการเต็มรูปแบบของการเข้ารหัส Java ที่สนับสนุนซึ่งเราต้องการใช้สองที่สั้นที่สุดสำหรับ codegolfing


13
การชนะโค้ดกอล์ฟของ Java ‽นั่นไม่ถูกต้อง
อดัม

1
@ Adám Hehe จริง ๆ แล้วฉันรู้สึกประหลาดใจและเห็นคำตอบที่ยาวกว่านี้ทั้งหมด ;) แต่ฉันค่อนข้างมั่นใจว่าเจลลี่, 05AB1E และอื่น ๆ จะชนะฉันในไม่ช้า
Kevin Cruijssen

1
ฉันสงสัย. พวกเขาอาจไม่มีตารางการแปลในตัว Dyalog APL ไม่ แต่ ...
อดัม

"ชื่อ Canonial สำหรับjava.nioAPI": P
ASCII เท่านั้นเท่านั้น

8

R 3.5.0 หรือสูงกว่า32 20 ไบต์

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

ลองออนไลน์!

สั้นผิดปกติสำหรับความท้าทายใน R ... ขอบคุณ JayCe สำหรับการเล่นกอล์ฟลงอีก 12 ไบต์!

scanเลือกที่จะใช้encodingอาร์กิวเมนต์เพื่อตั้งค่าการเข้ารหัสของสตริงที่ป้อน latin1สอดคล้องกับเอกสารอ้างอิงของEncoding

มีความคลุมเครือบางอย่างเกี่ยวกับความหมายของภาษา 'Latin-1' เนื่องจากระบบปฏิบัติการบางระบบ (โดยเฉพาะ Windows) ใช้ตำแหน่งของอักขระที่ใช้สำหรับอักขระควบคุมในชุดอักขระ ISO 8859-1 วิธีการตีความอักขระดังกล่าวนั้นขึ้นอยู่กับระบบ แต่เป็นจาก R 3.5.0 หากตีความเป็นไปได้ตามรหัสเพจของ Windows 1252 (ซึ่ง Microsoft เรียกว่า 'Windows Latin 1 (ANSI)' เมื่อแปลงเป็นเช่น UTF-8


3
ฉันติดตามลิงก์ไปยังเอกสารของEncoding... และเรียนรู้ว่าscanยังมีencodingข้อโต้แย้ง O_O ... 20 bytes
JayCe

@ JayCe whoda thunk มัน! ดีมาก!
Giuseppe

6

Python 2 , 40 38 ไบต์

-2 ไบต์ขอบคุณที่เอริก Outgolfer

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

ลองออนไลน์!

U8 utf-8เป็นนามแฝงสำหรับ


บางทีคุณอาจจะ "โกง" นิดหน่อยด้วยสิ่งนี้: input().decode(...).encode(...):) ฉันคิดว่าคุณอาจจะสามารถใช้การเข้ารหัสคอนโซล windows บางอันถ้าเป็น PowerShell (แต่ฉันไม่แน่ใจเกี่ยวกับเรื่องนี้ทั้งหมด)
KeyWeeUsr


@KeyWeeUsr ปัญหาเกี่ยวกับข้อเสนอแนะของคุณคือไม่ได้ส่งออกอะไรจริง ๆ ซึ่งตรงข้ามกับคำตอบที่คุณเชื่อมโยง R จะส่งออกค่าของการแสดงออกเปลือยในขณะที่ไม่
ovs

4

Python 3 , 38 36 34 ไบต์

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

ลองออนไลน์!

หมายเหตุ: หลังจากฉันมีฟังก์ชั่นการทำงานฉันใช้คำตอบคำตอบ python2 ของ ovsเพื่อเรียนรู้เกี่ยวกับฟิลด์ส่วนหัวและส่วนท้ายสำหรับ tio ดังนั้นส่วนหัวและส่วนท้ายจะเหมือนกัน

แก้ไข: ตัดมันเล็กน้อยขอบคุณ python3 defaulting เป็น utf8 และเคล็ดลับจากการส่งของ ovs :)




3

C #, 81 ไบต์

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

ลองออนไลน์!

ขอบคุณ Schmalls เป็นเวลา 3 ไบต์


สามารถusing e=System.Text.Encoding;s=>e.GetEncoding(1252).GetString(e.UTF8.GetBytes(s))ลงไปที่ 81 ได้ไหม?
Schmalls

@Schmalls ดูเหมือนว่าใช่ขอบคุณ!
Mego

2

180 ไบต์, รหัสเครื่อง (16- บิต x86)

ฉันสังเกตเห็นคำตอบส่วนใหญ่ใช้ builtin encode / decode (ซึ่งฉันเชื่อว่าใช้ได้ดี) แต่ฉันคิดว่าฉันจะทำเควส 16 บิตต่อไปต่อไป

เช่นเดียวกับคนก่อนหน้านี้ก็ทำโดยไม่ต้องคอมไพเลอร์ที่ใช้ส่วนใหญ่HexEditor HTและhexplorer ICY ของ

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

การผ่า

การใช้งานนั้นค่อนข้างตรงไปตรงมาแม้ว่าฉันจะไม่ได้คิดมากว่าจะไหลไปข้างหน้าเลย

ฉันจะสั่งผสมเล็กน้อยเพื่อให้ง่ายต่อการติดตาม ...

0000 eb40               jmp         0x42

ข้ามตารางที่จับคู่ตัวอักษร> = 0x80 <0xa0 ไปยังรหัส Unicode

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

รายการที่ไม่ถูกต้องถูกเข้ารหัสเป็น 0 พวกเขาจะไม่ถูกแมปกับสิ่งใด

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

ฟังก์ชั่นตัวช่วยที่ใช้ในการพิมพ์ถ่านในalจะถูกเรียกว่าไม่กี่ครั้ง

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         

เตรียมการลงทะเบียน ข้อมูลจะถูกอ่านเป็น 0x100 ให้siชี้ไปที่ตารางการแปลข้างต้น

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

อ่านถ่านจาก stdin ข้ามไปที่ 0x7d ถ้า EOF

Sidenote: นี้เป็นจริง (ที่รู้จักกัน แต่สวยดี) ขนาดเล็กเคล็ดลับ 0x7d มีretนี้จะทำให้เกิดpop sp, spที่จุดเริ่มต้นถึงปลายส่วนมี00 00มีและcs:0ใน DOS มีCD 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 ให้พิมพ์ออกมาและไปที่จุดเริ่มต้นของลูป (เนื่องจากฟังก์ชันตัวช่วยตั้งค่า BX เป็น 1 - stdout การกระโดดจะไปที่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       

ส่วนนี้เกี่ยวข้องกับ chars> = 0xa0 แยกรหัส ascii เป็น "high" สองบิตและ "low" 6 bits และใช้ utf-8 mask c080 สองไบต์แล้วพิมพ์ทั้งสองอย่าง

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       

ส่วนนี้เกี่ยวข้องกับ chars> = 0x80 <0xa0 จะพบรหัส utf-8 ที่เหมาะสมในตารางด้านบนหากรหัสเท่ากับ 0 เพียงข้ามไปเริ่มต้นหากต่ำกว่า 0x7ff (ergo: พอดีกับ UTF-8 สองไบต์) เพียงแค่ปรับค่าและใช้รหัสก่อนหน้านี้อีกครั้งที่ 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       

ส่วนสุดท้ายเกี่ยวข้องกับรหัสที่อยู่เหนือ 0x7FF ปล่อยบิตต่ำ 12 ใช้ 0xE0 (ดูคำอธิบายการเข้ารหัส UTF-8สำหรับการอ้างอิง) และพิมพ์ออกมาปรับ 12 บิตต่ำกว่าและใช้หน้ากาก 8080 และนำส่วนที่แยกออกมาสองครั้งออกมาใหม่ .


1

PHP + mbstring , 63 49 ไบต์

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

มันไม่ทำงานบน TIO เนื่องจากการขาด mbstring พารามิเตอร์ที่สามบังคับ mbstring เพื่อแปลความหมายสตริงที่เข้ารหัสของ Windows-1252

-14 ไบต์ขอบคุณ Ismael Miguel


<?=mb_convert_encoding($argv[1],'UTF8','CP1252');<- ยิ่งสั้นลง!
Ismael Miguel

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.