Dada uma sequência de caracteres, lista de caracteres, fluxo de bytes, sequência ... que é UTF-8 válido e Windows-1252 válido (a maioria dos idiomas provavelmente desejará usar uma sequência UTF-8 normal), converta-a (isto é, finja que é ) Windows-1252 para UTF-8 .
Exemplo percorrido
A sequência UTF-8
I
♥
U
T
F
-
8
é representada como os bytes
49
20
E2 99 A5
20
55
54
46
2D
38
desses valores de bytes na tabela Windows-1252 nos fornecem os equivalentes Unicode
49
20
E2 2122 A5
20
55
54
46
2D
38
que são renderizados como
I
â
™
¥
U
T
F
-
8
Exemplos
£
→ £
£
→ £
£
→ £
I ♥ UTF-8
→ I ♥ UTF-8
árvíztűrő tükörfúrógép
→ árvÃztűrÅ‘ tükörfúrógép
€ ‚ƒ„…†‡ˆ‰Š‹Œ Ž ‘’“”•–—˜™š›œ žŸ
. (space = unused)Respostas:
bash, 14 bytes
Experimente online!
fonte
Java 8,
72663625 bytesExperimente online.
cp1252
é um alias paraWindows-1252
. Esse aliascp1252
é o nome canônico das APIsjava.io
ejava.lang
, enquanto o nome completoWindows-1252
é o nome canônico dajava.nio
API. Veja aqui uma lista completa de codificações Java suportadas , onde sempre queremos usar o menor dos dois para codegolfing.fonte
java.nio
API": PR 3.5.0 ou superior,
3220 bytesExperimente online!
Estranhamente curto para um desafio de cordas em R ... obrigado a JayCe por jogar mais 12 bytes!
scan
opcionalmente, utiliza umencoding
argumento para definir a codificação da sequência de entrada.latin1
corresponde, de acordo com a documentação doEncoding
fonte
Encoding
... e soube quescan
também tem umencoding
argumento O_O ... 20 bytesPython 2 ,
4038 bytes-2 bytes graças a Erik, o Outgolfer .
Experimente online!
u8 é um apelido para
utf-8
.fonte
input().decode(...).encode(...)
:) também acho que você poderá usar alguma codificação do console do Windows se estiver no PowerShell (mas não tenho muita certeza disso).Python 3 ,
38 3634 bytesExperimente online!
note: Depois de ter uma função em funcionamento, usei a resposta python2 da ovs para aprender sobre os campos de cabeçalho e rodapé do tio, para que o cabeçalho e o rodapé sejam os mesmos
edit: Aparado um pouco graças ao python3 por padrão em utf8 e uma dica da submissão do ovs :)
fonte
JavaScript, 64 bytes
Mostrar snippet de código
Ainda mais do que a resposta Java. Tão triste. :(
fonte
Ruby , 31 bytes
Experimente online!
Os casos de testes estão incluídos no TIO
fonte
C #, 81 bytes
Experimente online!
Agradecimentos a Schmalls por 3 bytes
fonte
using e=System.Text.Encoding;s=>e.GetEncoding(1252).GetString(e.UTF8.GetBytes(s))
baixá-lo para 81?180 bytes, código de máquina (x86 de 16 bits)
Percebi que a maioria das respostas usa codificação / decodificação embutida (que eu acredito que esteja perfeitamente bem), mas pensei em continuar minha busca de 16 bits .
Como nos anteriores, isso foi feito sem o compilador, usando principalmente o hexeditor HT e o hexplorer da ICY .
Dissecação
A implementação é bem direta, embora eu não tenha pensado muito em fluir antecipadamente, então há ALGUM espaguete por lá.
Vou misturar um pouco a ordem, para facilitar o acompanhamento ...
Pule a tabela que mapeia caracteres> = 0x80 <0xa0, para códigos unicode.
Os inválidos são codificados como 0, não são mapeados para nada
A função auxiliar usada para imprimir char
al
será chamada algumas vezes.Prepare registros. Os dados serão lidos em 0x100, vamos
si
apontar para a tabela de conversão acima.Leia char de stdin, pule para 0x7d se EOF.
Nota: Este é realmente um pequeno (mas bastante conhecido) truque, 0x7d contém
ret
, isso fará com quepop sp
,sp
nos pontos de início ao final de um segmento,00 00
exista, ecs:0
no DOS contenhaCD 20
, o que faz com que o aplicativo saia.Se char for <0x80, imprima-o e vá para o início do loop (porque a função helper está configurando BX como 1 - stdout, os saltos irão para
dec bx
)Esta parte trata de chars> = 0xa0, divide o código ascii em "alto" dois bits e "baixo" 6 bits e aplica a máscara utf-8 c080 para dois bytes, depois imprime os dois
Esta parte lida com chars> = 0x80 <0xa0, encontra o código utf-8 adequado na tabela na parte superior, se o código for igual a 0, pule para o início, se estiver abaixo de 0x7ff (ergo: cabe em dois bytes UTF-8) , basta ajustar o valor e reutilizar o código anterior em 0x166.
A parte final, lida com códigos acima de 0x7FF, reduz 12 bits baixos, aplica 0xE0 (consulte a descrição da codificação UTF-8 para referência) e imprime, ajusta 12 bits inferiores e aplica a máscara 8080 e reutiliza novamente a parte que cospe dois caracteres .
fonte
PHP + mbstring ,
6349 bytes<?=mb_convert_encoding($argv[1],'UTF8','CP1252');
Não funciona no TIO devido à falta de mbstring. O terceiro parâmetro força o mbstring a interpretar a sequência como codificada em Windows-1252
-14 bytes graças a Ismael Miguel
fonte
<?=mb_convert_encoding($argv[1],'UTF8','CP1252');
<- ainda mais curto!C (gcc) +
libiconv
,119117 bytesExperimente online!
fonte