저를 모히십시오


26

인 문자열, 문자 목록, 바이트 스트림 순서 ... 감안할 때 모두 유효한 UTF-8 및 유효한 Windows-1252 (대부분의 언어는 아마도 정상 UTF-8 문자열을 할 것이다), 변환 입니다, (에서 이있다 ) Windows-1252 에서 UTF-8로 .

연습 예제

UTF-8 환경 문자열이
I            UTF-8
(가) 바이트로 표현되어
49 20E2 99 A520 55 54 46 2D 38
이러한 바이트 값을 윈도우-1252 테이블은 우리에게 유니 코드 등가물 제공
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 "변환"링크를 참조하십시오. 말장난입니다.
Outgolfer Erik

5
편의상 : Windows 1252 문자 세트는 문자가 0x80..0x9F 인 경우를 제외하고 유니 코드와 동일 € ‚ƒ„…†‡ˆ‰Š‹Œ Ž ‘’“”•–—˜™š›œ žŸ합니다. (space = 미사용)
user202729

3
@ user202729 어, 무슨 말을했는지 모르겠지만, 사실은 사실에 가깝지 않습니다. 유니 코드는 수백만 개의 문자를 가지고 있으며 Windows-1252는 256 개입니다.
David Conrad

1
@DavidConrad, "유니 코드에는 수백만 개의 문자가 있습니다"가 과장되었습니다. 유니 코드는 1,114,112 개의 코드 포인트를 정의합니다. 그 중 136,690 개의 코드 포인트가 현재 사용됩니다.
Wernfried Domscheit 2016

1
@Wernfried는이를 256 자 문자셋과 비교하고 있습니다.
David Conrad

답변:



19

자바 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-1252이고 전체 이름 은 java.nioAPI 의 정식 이름입니다 . 지원되는 Java 인코딩의 전체 목록을 보려면 여기를 참조하십시오. 여기에서 항상 코드 골프를 위해 둘 중 가장 짧은 것을 사용하려고합니다.


13
자바 코딩 코드 골프‽ 맞지 않다.
Adám

1
@ Adám Hehe, 나는이 모든 더 긴 답변을 볼뿐만 아니라 실제로 즐겁게 놀랐습니다. ;) 그러나 나는 Jelly, 05AB1E 등이 곧 나를 이길 것이라고 확신합니다.
Kevin Cruijssen

1
의심 스럽다. 내장 변환 테이블이 없을 수도 있습니다. Dyalog APL은…
Adám

" java.nioAPI의 정식 이름 ": P
ASCII 전용

8

R 3.5.0 이상 32 20 바이트

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

온라인으로 사용해보십시오!

이상한 R 도전에 ... 12 바이트를 더 줄인 JayCe 덕분에!

scan선택적으로 encoding입력 문자열의 인코딩을 설정하기 위해 인수를 사용합니다. latin1의 문서에 따르면Encoding

일부 OS (특히 Windows)는 ISO 8859-1 문자 세트에서 제어 문자에 사용되는 문자 위치를 사용하기 때문에 'Latin-1'로케일의 의미에 대한 모호함이 있습니다. 이러한 문자를 해석하는 방법은 시스템에 따라 다르지만 R 3.5.0부터 UTF-8로 변환 할 때 가능하면 Windows 코드 페이지 1252 (Microsoft에서 'ANSI (Windows Latin 1)'라고 함)에 따라 해석됩니다.


3
나는 문서에 대한 링크를 따라 가서 인수 O_O ... 20 바이트Encoding있음 scan을 알았습니다.encoding
JayCe

@JayCe whoda thunk it! 아주 좋아요!
주세페

6

파이썬 2 , 40 38 바이트

Outgolfer Erik 덕분에 -2 바이트 .

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

온라인으로 사용해보십시오!

u8은의 별칭입니다 utf-8.


아마도 당신은 이것으로 약간 "속임수"를 쓸 수 있습니다 : input().decode(...).encode(...):) 또한 powershell에서 일부 Windows 콘솔 인코딩을 사용할 수 있다고 생각합니다 (그러나 나는 이것에 대해 완전히 확신하지 못합니다 ).
KeyWeeUsr 2016 년


@KeyWeeUsr 귀하의 제안에 대한 문제는 귀하가 링크 한 답변과 달리 실제로 아무것도 출력하지 않는다는 것입니다. R은 베어 표현식의 값을 출력하지만 그렇지 않은 경우 출력합니다.
ovs


3

자바 스크립트, 64 바이트

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

Java 답변보다 훨씬 깁니다. 너무 슬퍼. :(



3

C #, 81 바이트

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

온라인으로 사용해보십시오!

3 바이트 Schmalls 덕분에


그것은 일 수있다 using e=System.Text.Encoding;s=>e.GetEncoding(1252).GetString(e.UTF8.GetBytes(s))(81)에 엎드려?
Schmalls

@Schmalls 예, 감사합니다!
Mego

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

chars> = 0x80 <0xa0을 유니 코드 코드로 매핑하는 테이블을 건너 뜁니다.

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에서 char을 읽고 EOF이면 0x7d로 이동하십시오.

(!) 참고 : 이것은 실제로 작은 (하지만 꽤 잘 알려진) 속임수, 0x7d 포함은 ret,이 원인이됩니다 pop sp, sp세그먼트의 끝 시작 지점에서,있다 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       

이 부분은 chars> = 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을 다루고, 맨 위의 테이블에서 적절한 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');

mbstring이 없기 때문에 TIO에서는 작동하지 않습니다. 세 번째 매개 변수는 mbstring이 문자열을 Windows-1252 인코딩으로 해석하도록합니다.

Ismael Miguel 덕분에 -14 바이트


<?=mb_convert_encoding($argv[1],'UTF8','CP1252');<-더 짧다!
Ismael Miguel

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.