Я подтвердил, что это работает на моем компьютере с Windows, поэтому сейчас напечатаю это как ответ.
В исходном коде, если вы копируете/вставляете символы напрямую, убедитесь, что ваш редактор сохраняет их в кодировке utf8. Компилятор D настаивает на этом, поэтому, если он выдает ошибку компиляции по поводу utf, возможно, поэтому. Я никогда не использовал 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);
прямо при запуске - выход из области видимости будет запущен при выходе из функции, поэтому делать это в основном было бы довольно удобно. Просто добавьте проверку ошибок, если хотите.
В документах Microsoft ничего не говорится об установке обратно, так что это, вероятно, не имеет значения, но все же я хочу упомянуть об этом на всякий случай. Но также знание того, что он является общим и сохраняется, может помочь в отладке - если он работает после того, как вы его прокомментируете, это не потому, что код не нужен, а просто потому, что он был установлен ранее и еще не отменен!
Обратите внимание, что запуск его из IDE может быть не совсем таким же, потому что IDE часто направляют вывод вместо того, чтобы запускать его прямо на консоль Windows. Если это произойдет, дайте мне знать, и мы можем напечатать кое-что об этом для будущих читателей. Но вы также можете открыть свою собственную копию консоли (запустить программу вне IDE), и она должна отображаться правильно для вас.
person
Adam D. Ruppe
schedule
25.11.2018
\uxxxx
для записи других символов. Для вывода та же функция является ответом: помните, D может вызывать функции C так же, как C. Так что да,SetConsoleOutputCP(65001)
перед выполнением вывода должно работать. Вы можетеimport core.sys.windows.windows;
сделать эту функцию определенной. - person Adam D. Ruppe   schedule 25.11.2018