Back mir etwas Moji

26

Bei einer Zeichenkette, Zeichenliste, Byte - Stream, Folge ... , die sowohl gültige UTF-8 und gültige Windows-1252 ( die meisten Sprachen werden wahrscheinlich einen normalen UTF-8 - String nehmen wollen), wandeln sie aus (das heißt, so tun , als es ist ) Windows-1252 bis UTF-8 .

Durchgelaufenes Beispiel

Die UTF-8-Zeichenfolge
I            UTF-8
wird als Byte dargestellt.
49 20E2 99 A520 55 54 46 2D 38
Diese Byte-Werte in der Windows-1252-Tabelle geben uns die Unicode-Entsprechungen an,
49 20 E2 2122 A5 20 55 54 46 2D 38
die als gerendert werden
I ⥠UTF-8

Beispiele

£Â£

£Â£

£Â£

I ♥ UTF-8I ♥ UTF-8

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

Adam
quelle
9
@ user202729 Siehe Link "Konvertieren". Es ist ein Wortspiel.
Erik der Outgolfer
5
Zur Vereinfachung: Der Windows 1252-Zeichensatz entspricht Unicode, mit Ausnahme von 0x80..0x9F, in dem sich die Zeichen befinden € ‚ƒ„…†‡ˆ‰Š‹Œ Ž ‘’“”•–—˜™š›œ žŸ. (Leerzeichen = nicht verwendet)
user202729
3
@ user202729 Äh, ich bin mir nicht sicher, was Sie sagen wollten, aber das ist nicht annähernd wahr. Unicode hat Millionen von Zeichen, Windows-1252 nur 256.
David Conrad
1
@DavidConrad, "Unicode hat Millionen von Zeichen" ist übertrieben. Unicode definiert 1.114.112 Codepunkte. Davon werden derzeit 136.690 Codepunkte verwendet.
Wernfried Domscheit
1
@Wernfried der Punkt ist der Vergleich mit einem 256-stelligen Zeichensatz.
David Conrad

Antworten:

19

Java 8, 72 66 36 25 Bytes

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

Probieren Sie es online aus.

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

cp1252ist ein Alias ​​für Windows-1252. Dieser Alias cp1252ist der kanonische Name für die APIs java.iound java.lang, während der vollständige Name Windows-1252der kanonische Name für die java.nioAPI ist. Hier finden Sie eine vollständige Liste der unterstützten Java-Codierungen , bei denen wir immer die kürzeste der beiden für das Codegolfing verwenden möchten.

Kevin Cruijssen
quelle
13
Java-Gewinncode Golf‽ Das kann nicht richtig sein.
Adám
1
@ Adám Hehe, ich bin eigentlich auch angenehm überrascht, all diese längeren Antworten zu sehen. ;) Aber ich bin mir ziemlich sicher, dass Jelly, 05AB1E usw. mich bald schlagen werden.
Kevin Cruijssen
1
Ich bezweifle das. Sie haben wahrscheinlich keine eingebauten Übersetzungstabellen. Dyalog APL macht zwar ...
Adám
"Canonial Name for the java.nioAPI": P
Nur ASCII
8

R 3.5.0 oder höher, 32 20 Bytes

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

Probieren Sie es online!

Seltsamerweise kurz für eine Herausforderung in R ... danke an JayCe, der 12 weitere Bytes gesenkt hat!

scanOptional kann ein encodingArgument verwendet werden, um die Codierung der Eingabezeichenfolge festzulegen. latin1entspricht laut der Dokumentation vonEncoding

Es besteht eine gewisse Unklarheit darüber, was unter einem Gebietsschema 'Latin-1' zu verstehen ist, da einige Betriebssysteme (insbesondere Windows) Zeichenpositionen verwenden, die für Steuerzeichen im Zeichensatz ISO 8859-1 verwendet werden. Wie solche Zeichen interpretiert werden, ist systemabhängig. Ab R 3.5.0 werden sie jedoch nach Möglichkeit gemäß Windows-Codepage 1252 (von Microsoft als 'Windows Latin 1 (ANSI)' bezeichnet) bei der Konvertierung in z. B. UTF-8 interpretiert.

Giuseppe
quelle
3
Ich folgte dem Link zur Dokumentation von Encoding... und erfuhr, dass scanauch ein encodingArgument O_O ... 20 Bytes hat
JayCe
@ JayCe whoda thunk es! Sehr schön!
Giuseppe
6

Python 2 , 40 38 Bytes

-2 Bytes dank Erik dem Outgolfer .

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

Probieren Sie es online!

u8 ist ein Alias ​​für utf-8.

ovs
quelle
Vielleicht könnten Sie ein wenig damit "schummeln": input().decode(...).encode(...):) Ich denke auch, dass Sie in der Lage sein könnten, einige Windows-Konsolen-Codierungen zu verwenden, wenn Sie in Powershell sind (aber ich bin völlig unsicher darüber).
KeyWeeUsr
@KeyWeeUsr Das Problem mit Ihrem Vorschlag ist, dass im Gegensatz zu der von Ihnen verknüpften Antwort eigentlich nichts ausgegeben wird. R gibt den Wert des bloßen Ausdrucks aus, nicht jedoch.
Ovs
3

JavaScript, 64 Byte

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

Noch länger als Java antworten. So traurig. :(

tsh
quelle
3

C #, 81 Bytes

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

Probieren Sie es online!

Danke an Schmalls für 3 Bytes

Mego
quelle
Kann es sein using e=System.Text.Encoding;s=>e.GetEncoding(1252).GetString(e.UTF8.GetBytes(s)), es auf 81 zu bringen?
Schmalls
@Schmalls Sieht ja aus, danke!
Mego
2

180 Byte, Computercode (16-Bit x86)

Mir ist aufgefallen, dass die meisten Antworten die integrierte Codierung / Decodierung verwenden (was meiner Meinung nach vollkommen in Ordnung ist), aber ich dachte, ich werde meine 16-Bit-Suche fortsetzen .

Wie bei den vorherigen wurde dies ohne Compiler durchgeführt, wobei hauptsächlich HT-Hexeditor und ICYs Hexplorer verwendet wurden .

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  <[email protected]                  
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

Präparation

Die Implementierung ist ziemlich unkompliziert, obwohl ich nicht viel darüber nachgedacht habe, im Voraus zu fließen, so dass es einige Spaghetti gibt.

Ich werde die Reihenfolge ein wenig mischen, um es einfacher zu machen, zu folgen ...

0000 eb40               jmp         0x42

Überspringen Sie eine Tabelle, die Zeichen> = 0x80 <0xa0 Unicode-Codes zuordnet.

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

Ungültige werden als 0 codiert und keiner Zuordnung zugeordnet

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

Die Hilfsfunktion zum Ausdrucken von Zeichen alwird mehrmals aufgerufen.

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         

Register vorbereiten. Die Daten werden in 0x100 eingelesen. Zeigen Sie siin die obige Übersetzungstabelle.

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

Lese char von stdin, springe zu 0x7d wenn EOF.

Nebenbemerkung: Dies ist eigentlich ein kleiner (aber ziemlich bekannter) Trick, den 0x7d enthält ret. Dies führt dazu pop sp, dass sich span den Startpunkten bis zum Ende eines Segments ein solcher Trick 00 00befindet und cs:0in DOS enthält CD 20, wodurch die Anwendung beendet wird.

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

Wenn char <0x80 ist, drucken Sie es einfach aus und gehen Sie zum Schleifenanfang (da die Hilfsfunktion BX auf 1 - stdout setzt, gehen die Sprünge zu 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       

Dieser Teil befasst sich mit Zeichen> = 0xa0, teilt ASCII-Code in "hohe" zwei Bits und "niedrige" 6 Bits auf und wendet die utf-8-Maske c080 für zwei Bytes an und druckt dann beide

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       

Dieser Teil befasst sich mit Zeichen> = 0x80 <0xa0, findet den richtigen utf-8-Code in der Tabelle oben, wenn der Code gleich 0 ist, springe zum Anfang, wenn er unter 0x7ff liegt (ergo: passt auf zwei UTF-8-Bytes) Passen Sie einfach den Wert an und verwenden Sie den vorherigen Code erneut bei 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       

Der letzte Teil befasst sich mit Codes, die über 0x7FF liegen, löscht niedrige 12 Bits, wendet 0xE0 an (siehe UTF-8-Codierungsbeschreibung als Referenz) und druckt es aus, stellt die unteren 12 Bits ein und wendet die 8080-Maske an und verwendet den Teil, der zwei Zeichen ausspuckt, erneut .

GiM
quelle
1

PHP + mbstring , 63 49 Bytes

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

Es funktioniert nicht auf TIO aufgrund des Fehlens von mbstring. Der dritte Parameter zwingt mbstring, die Zeichenfolge als Windows-1252-codiert zu interpretieren

-14 Bytes dank Ismael Miguel

Sefa
quelle
<?=mb_convert_encoding($argv[1],'UTF8','CP1252');<- noch kürzer!
Ismael Miguel
0

C (gcc) + libiconv, 119 117 Bytes

*f(s,t,u)void*s,*t,*u;{long i=strlen(s),j=i*4;u=t=malloc(j);iconv(iconv_open("UTF8","CP1252"),&s,&i,&u,&j);return t;}

Probieren Sie es online!

ErikF
quelle
Sie sollten in diesem Fall die Sprache in "C (gcc) + libiconv" ändern
ASCII
103 Bytes
Ceilingcat