Учитывая строку, список символов, поток байтов, последовательность ... которая является допустимой UTF-8 и действительной Windows-1252 (большинство языков, вероятно, захотят взять обычную строку UTF-8), преобразуйте ее из (то есть представьте, что это ) Windows-1252 для UTF-8 .
Проходной пример
Строка UTF-8
I
♥
U
T
F
-
8
представляется в виде байтов,
49
20
E2 99 A5
20
55
54
46
2D
38
эти значения байтов в таблице Windows-1252 дают нам эквиваленты Unicode,
49
20
E2 2122 A5
20
55
54
46
2D
38
которые отображаются как
I
â
™
¥
U
T
F
-
8
Примеры
£
→ £
£
→ £
£
→ £
I ♥ UTF-8
→ I ♥ UTF-8
árvíztűrő tükörfúrógép
→ árvÃztűrÅ‘ tükörfúrógép
€ ‚ƒ„…†‡ˆ‰Š‹Œ Ž ‘’“”•–—˜™š›œ žŸ
. (пробел = не используется)Ответы:
Баш, 14 байтов
Попробуйте онлайн!
источник
Java 8,
72663625 байтПопробуйте онлайн.
cp1252
это псевдоним дляWindows-1252
. Этот псевдонимcp1252
является каноническим именем дляjava.io
иjava.lang
API - интерфейсов, в то время как полное имяWindows-1252
является каноническим именем дляjava.nio
API. Смотрите здесь полный список поддерживаемых кодировок Java , где мы всегда хотели бы использовать самое короткое из двух для кодгольфинга.источник
java.nio
API»: PR 3.5.0 или выше,
3220 байтПопробуйте онлайн!
Как ни странно мало для струнного вызова в R ... благодаря Jayce для игры в гольф вниз еще 12 байт!
scan
опционально принимаетencoding
аргумент для установки кодировки входной строки.latin1
соответствует, согласно документацииEncoding
источник
Encoding
... и узнал, чтоscan
также имеетencoding
аргумент O_O ... 20 байтPython 2 ,
4038 байт-2 байта благодаря Эрику Аутгольферу .
Попробуйте онлайн!
u8 это псевдоним для
utf-8
.источник
input().decode(...).encode(...)
:) также я думаю, что вы могли бы использовать некоторую кодировку консоли Windows, если в PowerShell (но я совершенно не уверен в этом).Python 3 ,
38 3634 байтаПопробуйте онлайн!
примечание: после того, как у меня появилась рабочая функция, я использовал ответ ovs's python2 answer, чтобы узнать о полях верхнего и нижнего колонтитула для tio, поэтому верхний и нижний колонтитулы совпадают
редактирование: немного обрезано благодаря python3 по умолчанию utf8 и совет от ovs :)
источник
JavaScript, 64 байта
Показать фрагмент кода
Даже дольше, чем ответ Java. Очень грустно. :(
источник
Рубин , 31 байт
Попробуйте онлайн!
Тестовые случаи включены в TIO
источник
C #, 81 байт
Попробуйте онлайн!
Спасибо Schmalls за 3 байта
источник
using e=System.Text.Encoding;s=>e.GetEncoding(1252).GetString(e.UTF8.GetBytes(s))
до 81?180 байт, машинный код (16-битный x86)
Я заметил, что в большинстве ответов используется встроенное кодирование / декодирование (что, я считаю, прекрасно), но я решил продолжить 16-битный квест .
Как и предыдущие, это было сделано без компилятора с использованием в основном HT двоичный редактор и hexplorer Icy в .
рассечение
Реализация довольно прямолинейна, хотя я не слишком задумывался над тем, чтобы продвигаться вперед, поэтому там есть НЕКОТОРЫЕ спагетти.
Я немного смешаю порядок, чтобы было легче следовать ...
Пропустите таблицу, которая отображает символы> = 0x80 <0xa0, в коды Unicode.
Неверные из них кодируются как 0, они ни к чему не привязаны
Вспомогательная функция, используемая для печати char
al
, будет вызываться несколько раз.Подготовьте регистры. Данные будут считаны в 0x100, пусть
si
указывается в таблице перевода выше.Чтение символа из стандартного ввода, переход к 0x7d, если EOF.
Sidenote: Это на самом деле небольшой (но довольно хорошо известный) трюк, 0x7d содержит
ret
, это приведет к томуpop sp
, чтоsp
в начальных точках до конца сегмента есть00 00
, аcs:0
в DOS содержитCD 20
, что приводит к выходу приложения.Если char <0x80, просто распечатайте его и перейдите к началу цикла (поскольку вспомогательная функция устанавливает BX в 1 - stdout, переходы переходят в
dec bx
)Эта часть имеет дело с символами> = 0xa0, разбивает код ascii на «старшие» два бита и «младшие» 6 бит и применяет маску utf-8 c080 для двух байтов, а затем печатает оба из них
Эта часть имеет дело с символами> = 0x80 <0xa0, она находит правильный код utf-8 в таблице вверху, если код равен 0, просто перейдите к началу, если он меньше 0x7ff (ergo: подходит для двух байтов UTF-8) просто измените значение и повторно используйте предыдущий код в 0x166.
В заключительной части рассматриваются коды выше 0x7FF, отбрасываются младшие 12 битов, применяются 0xE0 ( для справки см. Описание кодирования UTF-8 ) и распечатывается его, корректируются младшие 12 битов, применяется маска 8080 и снова используется часть, которая выплевывает два символа. ,
источник
PHP + mbstring ,
6349 байт<?=mb_convert_encoding($argv[1],'UTF8','CP1252');
Он не работает на TIO из-за отсутствия mbstring. Третий параметр заставляет mbstring интерпретировать строку в кодировке Windows-1252.
-14 байт благодаря Исмаилу Мигелю
источник
<?=mb_convert_encoding($argv[1],'UTF8','CP1252');
<- еще короче!C (gcc) +
libiconv
,119117 байтПопробуйте онлайн!
источник