Чтобы ответить на ваш первый вопрос, вы можете вывести строки Unicode в консоль Windows, используя _setmode . Конкретные подробности относительно этого можно найти в блоге Майкла Каплана . По умолчанию консоль не является Unicode (UCS-2 / UTF-16). Он работает в режиме Ansi (локаль / кодовая страница) и должен быть специально настроен для использования Unicode.
Кроме того, вы должны изменить шрифт консоли, так как шрифт по умолчанию поддерживает только символы Ansi. Здесь есть некоторые незначительные исключения, такие как символы ASCII с расширением нуля, но для печати реальных символов Unicode необходимо использовать _setmode.
В Windows все является UTF-16. Независимо от того, имеете ли вы дело с ядром, графической подсистемой, файловой системой или чем-то еще, вы передаете строки UTF-16. В смысле Unix нет локалей или кодировок.
Это не совсем так. Хотя базовое ядро Windows действительно использует Unicode, в игру вступает огромное количество возможностей взаимодействия, которые позволяют Windows взаимодействовать с широким спектром программного обеспечения.
Рассмотрим блокнот (да, блокнот далек от основного компонента, но он меня понял). Блокнот имеет возможность читать файлы, которые содержат Ansi (вашу текущую кодовую страницу), Unicode или UTF-8. Вы можете считать блокнот приложением Unicode, но это не совсем точно.
Лучший пример - драйверы. Драйверы могут быть написаны на Unicode или Ansi. Это действительно зависит от характера интерфейса. Для этого Microsoft предоставляет библиотеку StrSafe , которая была специально написана с учетом драйверов режима ядра и включает в себя как Unicode, так и Ansi версии . Хотя драйверы являются либо Ansi, либо Unicode, ядро Windows должно взаимодействовать с ними - правильно - независимо от того, какую форму они принимают.
Чем дальше вы находитесь от ядра Windows, тем больше взаимодействия вступает в игру. Это включает кодовые страницы и локали . Вы должны помнить, что не все программное обеспечение написано с учетом Unicode. Visual C ++ 2010 по-прежнему обладает способностью строить с использованием Ansi, Multi-Byte или Unicode. Это включает использование кодовых страниц и locales , которые являются частью стандарта C / C ++.
Однако, я думаю, что это представляет собой недостаток дизайна в Windows API
следующие две статьи обсуждают это довольно хорошо.
Итак, мои вопросы: что делать в этой ситуации? И почему эта проблема не решается даже в собственных библиотеках Microsoft? Как библиотеки .NET Framework, так и библиотеки C и C ++ придерживаются устаревшей модели кодовых страниц. Как бы вы разработали Windows API или прикладную среду, чтобы обойти эту проблему?
На данный момент, я думаю, вы смотрите на Windows в ретроспективно . Unicode не пришел первым, ASCII сделал. После ASCII пришли кодовые страницы . После кодовых страниц пришли DBCS . После DBCS пришли MBCS (и в конечном итоге UTF-8). После UTF-8 пришел Unicode (UTF-16 / UCS-2).
Каждая из этих технологий была включена в ОС Windows на протяжении многих лет. Каждое здание на последнем, но не ломая друг друга. Программное обеспечение было написано с учетом каждого из них. Иногда это может показаться не таким, но Microsoft прилагает огромное количество усилий к , а не программам, которые она не писала. Даже сейчас вы можете написать новое программное обеспечение, которое использует любую из этих технологий, и оно будет работать.
Реальный ответ здесь - «совместимость». Microsoft по-прежнему использует эти технологии, как и многие другие компании. Существует огромное количество программ, компонентов и библиотек, которые не были обновлены (или будут обновлены) для использования Unicode. Даже когда появляются новые технологии, такие как .NET, старые технологии должны оставаться на месте. По крайней мере, для совместимости.
Например, допустим, у вас есть DLL, с которой вам нужно взаимодействовать из .NET, но эта DLL была написана с использованием Ansi (локализованная однобайтовая кодовая страница) Что еще хуже, у вас нет источника для DLL. Единственный ответ здесь - использовать эти устаревшие функции.