Я подтвердил, что это работает на моем компьютере с Windows, поэтому сейчас наберу это в качестве ответа.
В исходном коде, если вы копируете / вставляете символы напрямую, убедитесь, что ваш редактор сохраняет их вкодировка utf8.На этом настаивает D-компилятор, поэтому, если он выдает ошибку компиляции о чем-то, возможно, именно поэтому.Я никогда не использовал c: b, но старый ответ в Интернете гласил edit-> encodings ... это настройка где-то в редакторе независимо от того.
Или вы можете заменить символы в вашем исходном коде на\uxxxx
в строках.НЕ используйте шестнадцатеричную строку, то есть для двоичных байтов, но ваш пример "\u00E0"
хорош и будет работать для любого типа строки (не только для wstring, как в вашем примере).
Затем, насторона вывода, это зависит от вашей цели, потому что программа просто выводит байты, и программа получателя должна правильно ее интерпретировать.Поскольку вы сказали, что находитесь в Windows, ключом является установка кодовой страницы консоли в utf-8, чтобы она знала, что вы пытаетесь сделать.Действительно, та же самая функция C может быть вызвана и из D.Приводит к этой программе:
import core.sys.windows.windows;
import std.stdio;
void main() {
SetConsoleOutputCP(65001);
writeln("Hi \u00E0");
}
печать успешно.В старых версиях Windows вам может потребоваться изменить шрифт, чтобы увидеть символ (в отличие от общего окна, которое он показывает, потому что некоторые шрифты не имеют всех символов), но в моем окне Windows 10 он просто работал сшрифт по умолчанию.
Кстати, технически кодовая страница консоли является общей настройкой (после запуска программы и ее выхода вы все равно можете нажать свойства в окне консоли и увидеть изменения, отраженные там), и вам, возможно, следует установить ееназад, когда ваша программа выходит.Вы можете получить это при запуске с помощью функции get (https://docs.microsoft.com/en-us/windows/console/getconsoleoutputcp), сохранить ее в локальной переменной и установить обратно при выходе.Вы можете auto ccp = GetConsoleOutputCP(); SetConsoleOutputCP(65005;) scope(exit) SetConsoleOutputCP(ccp);
прямо при запуске - выход из области будет запущен при выходе из функции, так что делать это в main было бы довольно удобно.Просто добавьте проверку ошибок, если хотите.
В документах Microsoft ничего не говорится об их установке, так что, вероятно, это на самом деле не имеет значения, но все же я хочу упомянуть об этом на всякий случай.Но также знание того, что оно является общим и сохраняется, может помочь в отладке - если оно работает после того, как вы прокомментируете его, это не потому, что код не нужен, а просто потому, что он был установлен ранее и еще не установлен!
Обратите внимание, что запуск его из IDE может не совпадать, потому что IDE часто направляют вывод, а не запускают его прямо на консоль Windows.Если это произойдет, позвольте мне знать, и мы можем напечатать кое-что об этом для будущих читателей.Но вы также можете открыть свою собственную копию консоли (запустить программу вне IDE), и она должна отображаться правильно для вас.