#
Вывод русских букв в консоли Windows
Наверное многие сталкивались с проблемой вывода русских букв в консоли Windows из программы на Zig. Объясняется это несоответствием кодировки консоли и кодировки программы. Я столкнулся с этим когда делал простую консольную утилиту на языке Zig и использовал кросс-компиляцию для нескольких платформ. Решением было бы использование кодировки UTF-8 в консоли Windows.
Вот этим мы сейчас и займемся.
#
Исследование проблемы
Собственно, суть проблемы понятна. Осталось понять как решить ее?
Беглое изучение вопроса довольно быстро привело к знанию о том, что в API Windows есть функция SetConsoleOutputCP, которая позволяет установить кодировку вывода консоли.
Дальнейшее изучение показало, что в Zig эта функция импортирована и доступна в стандартной библиотеке в пространстве имён std.os.windows.kernel32. Дальше, вооружившись этим знанием, уже дело техники.
#
Пример реализации
Вот пример реализации:
const std = @import("std");
const builtin = @import("builtin");
const CP_UTF8 = 65001;
pub fn main() !void {
if (builtin.os.tag == .windows) {
_ = std.os.windows.kernel32.SetConsoleOutputCP(CP_UTF8);
}
std.debug.print("Привет, мир!»\n", .{});
}
В данном примере мы проверяем, что мы работаем на Windows и устанавливаем кодировку вывода консоли в UTF-8. Затем выводим строку "Привет, мир!»".
Примечание: пример работает только на Windows 10 и новее. Получить тот же результат на более старых версиях Windows мне не удалось.