絵文字を焼いて


26

有効なUTF-8および有効なWindows-1252(ほとんどの言語は、おそらく通常のUTF-8文字列を取ることになるでしょう)の両方で、文字列、文字リスト、バイトストリーム、シーケンス...を考えると、それを変換、である(からふり、それをあります)Windows-1252からUTF-8

ウォークスルーの例

UTF-8文字列
I            UTF-8
、Windows-1252テーブルの
49 20E2 99 A520 55 54 46 2D 38
これらのバイト値が、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「変換」リンクを参照してください。それはしゃれです。
エリックアウトゴルファー

5
便宜上:Windows 1252の文字セットは、文字がである0x80..0x9Fを除き、Unicodeと同じ€ ‚ƒ„…†‡ˆ‰Š‹Œ Ž ‘’“”•–—˜™š›œ žŸです。(スペース=未使用)
user202729

3
@ user202729ええと、私はあなたが何を言おうとしていたのかわかりませんが、それは事実に近いとは言えません。Unicodeは、Windowsの-1252のみ256文字の何百万を持っている
デヴィッド・コンラッド

1
@DavidConrad、「Unicodeには数百万の文字があります」は誇張されています。Unicodeは1,114,112コードポイントを定義します。現在、136,690個のコードポイントが使用されています。
Wernfried Domscheit

1
@Wernfriedは、それを256文字の文字セットと比較しています。
デビッドコンラッド

回答:



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

cp1252はのエイリアスですWindows-1252。このエイリアスcp1252java.iojava.langAPIの正規名であり、フルネームWindows-1252java.nioAPIの正規名です。サポートされているJavaエンコーディングの完全なリストについては、こちらをご覧ください。ここでは、常に2つのうち最短のものをcodegolfingに使用したいと考えています。


13
Javaで優勝したコードゴルフ‽それは正しくありません。
アダム

1
@AdámHehe、これらのより長い答えをすべて見て、私も実際に嬉しく驚いています。;)しかし、Jelly、05AB1Eなどはすぐに私を倒すと確信しています。
ケビンクルーッセン

1
私はそれを疑います。おそらく、変換テーブルが組み込まれていません。しかし、Dyalog APLは…
アダム

java.nioAPIの正規名」:P
ASCIIのみ

8

R 3.5.0以降、32 20バイト

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

オンラインでお試しください!

奇妙なことに、Rでのチャレンジの略です。JayCeがさらに12バイトのゴルフをしてくれてありがとう!

scanオプションencodingで、入力文字列のエンコーディングを設定する引数を取ります。latin1の文書によると、Encoding

一部のOS(特にWindows)は、ISO 8859-1文字セットの制御文字に使用される文字位置を使用するため、「Latin-1」ロケールが何を意味するかに関して、あいまいさがあります。このような文字の解釈方法はシステムに依存しますが、R 3.5.0以降では、UTF-8などに変換する場合、可能であればWindowsコードページ1252(Microsoftは「Windows Latin 1(ANSI)」と呼びます)に従って解釈されます。


3
私はのドキュメントへのリンクをたどっEncoding...とすることを学んscanも持っているencoding引数O_Oを... 20バイト
JayCe

@JayCe whodaサンク!非常に素晴らしい!
ジュゼッペ

6

パイソン240の 38バイト

Erik the Outgolferに感謝-2バイト。

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

オンラインでお試しください!

u8はのエイリアスですutf-8


おそらく、これで少し「チート」することができます:input().decode(...).encode(...):)また、PowerShellの場合は、Windowsコンソールのエンコーディングを使用できるかもしれません(しかし、これについてはまったくわかりません)。
KeyWeeUsr


@KeyWeeUsrあなたの提案の問題は、あなたがリンクした答えとは対照的に、実際には何も出力しないということです。Rは裸の式の値を出力しますが、出力しません。
ovs

4

Pythonの338の36 34バイト

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

オンラインでお試しください!

注:作業関数を作成した後、ovsのpython2回答を使用して、tioのヘッダーフィールドとフッターフィールドについて学習したため、ヘッダーとフッターは同じです

編集:utf8にデフォルト設定されているpython3とovsのサブミットからのヒントのおかげで少しトリミングされました:)


3

JavaScript、64バイト

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

Javaの回答よりも長い。とても悲しい。:(




2

180バイト、マシンコード(16ビットx86)

私はほとんどの答えが組み込みのエンコード/デコードを使用していることに気づきました(これは完全に問題ないと思います)が、16ビットクエストを続けると思いました。

以前のものと同様に、これはほとんどHT hexeditorICYのhexplorerを使用してコンパイラなしで行われました

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                    

でcharを出力するために使用されるヘルパー関数は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からcharを読み取り、EOFの場合は0x7dにジャンプします。

追記:これは実際に小さな(しかし、かなりよく知られている)トリックで、0x7d含まれているがret、これは発生しますpop spspセグメントの開始から終了までの時点で、あります00 00そこに、そしてcs:0DOSに含まれ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       

この部分は0xa0以上の文字を扱い、ASCIIコードを「高」2ビットと「低」6ビットに分割し、2バイトのutf-8マスク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を扱い、コードが0に等しい場合は最上部のテーブルで適切なutf-8コードを見つけ、0x7ff未満であれば先頭にスキップします(ergo:2つの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マスクを適用し、2つの文字を吐き出す部分を再利用します。


1

PHP + mbstring63 49バイト

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

mbstringがないため、TIOでは機能しません。3番目のパラメーターは、mbstringにWindows-1252エンコードとして文字列を解釈させる

Ismael Miguelのおかげで-14バイト


<?=mb_convert_encoding($argv[1],'UTF8','CP1252');<-さらに短く!
イスマエルミゲル

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.