Консоль Windows была известна Unicode в течение как минимум десятилетия и, возможно, еще в Windows NT. Однако по некоторым причинам основные межплатформенные языки сценариев, в том числе Perl и Python, только выводят различные 8-битные кодировки, требующие больших проблем для работы. Perl дает предупреждение "широкий символ в печати", Python дает ошибку charmap и завершает работу. Почему после всех этих лет они просто не просто называют API Win32-W, которые выводят Unicode UTF-16, а не заставляют все через узкое место ANSI/кодовой страницы?
Это просто кросс-платформенная производительность - низкий приоритет? Является ли это тем, что языки используют UTF-8 внутри и слишком сильно беспокоятся о выходе UTF-16? Или API-интерфейсы -W по своей сути повреждены до такой степени, что их нельзя использовать как-есть?
UPDATE
Кажется, что вину, возможно, придется разделять всеми сторонами. Я предположил, что языки сценариев могут просто вызвать wprintf
в Windows и позволить OS/runtime беспокоиться о таких вещах, как перенаправление. Но оказывается, что даже wprintf на Windows преобразует широкие символы в ANSI и обратно перед печатью на консоль!
Пожалуйста, дайте мне знать, если это было исправлено, поскольку ссылка с сообщением об ошибке выглядит сломанной, но мой тестовый код Visual C по-прежнему не работает для wprintf и преуспевает для WriteConsoleW.
ОБНОВЛЕНИЕ 2
На самом деле вы можете распечатать UTF-16 на консоли с помощью C с помощью wprintf
, но только если вы сначала сделаете _setmode(_fileno(stdout), _O_U16TEXT)
.
С C вы можете распечатать UTF-8 на консоли, чья кодовая страница установлена на кодовую страницу 65001, однако Perl, Python, PHP и Ruby имеют ошибки, которые предотвращают это. Perl и PHP коррумпируют вывод, добавляя дополнительные пустые строки по строкам, которые содержат по крайней мере один широкий символ. Ruby имеет несколько разный коррумпированный результат. Сбой Python.
ОБНОВЛЕНИЕ 3
Node.js - первый скриптовый язык, который поставляется без этой проблемы прямо из коробки.
Команда разработчиков Python медленно поняла, что это была настоящая проблема, поскольку она была впервые опубликована в конце 2007 года и увидела огромный шквал активности, чтобы полностью понять и полностью исправить ошибку в 2016 году.