diff --git a/cli/commands/init.zig b/cli/commands/init.zig index 292d9f0..53e11be 100644 --- a/cli/commands/init.zig +++ b/cli/commands/init.zig @@ -3,7 +3,7 @@ const args = @import("args"); const util = @import("../util.zig"); const cli = @import("../cli.zig"); - +const uPrint = @import("unicodeprint.zig"); const init_data = @import("init_data").init_data; /// Command line options for the `init` command. @@ -209,7 +209,7 @@ pub fn run( // const git_setup = false; // if (git_setup) try gitSetup(allocator, install_dir); - std.debug.print( + try uPrint.unicodePrint( \\ \\Setup complete! ✈️ 🦎 \\ diff --git a/cli/commands/unicodeprint.zig b/cli/commands/unicodeprint.zig new file mode 100644 index 0000000..2382c4e --- /dev/null +++ b/cli/commands/unicodeprint.zig @@ -0,0 +1,41 @@ +const std = @import("std"); +const builtin = @import("builtin"); + +pub fn unicodePrint(comptime fmt: []const u8, args: anytype) !void { + if (builtin.os.tag == .windows) { + // Windows-specific code + const cp_out = try UTF8ConsoleOutput.init(); + defer cp_out.deinit(); + + std.debug.print(comptime fmt, args); + } else { + // Non-Windows platforms just print normally + std.debug.print(fmt, args); + } +} +const UTF8ConsoleOutput = struct { + original: if (builtin.os.tag == .windows) c_uint else void, + + fn init() !UTF8ConsoleOutput { + if (builtin.os.tag == .windows) { + const original = std.os.windows.kernel32.GetConsoleOutputCP(); + if (original == 0) { + return error.FailedToGetConsoleOutputCP; + } + const result = std.os.windows.kernel32.SetConsoleOutputCP(65001); // UTF-8 code page + if (result == 0) { + return error.FailedToSetConsoleOutputCP; + } + return .{ .original = original }; + } + // For non-Windows, return an empty struct + return .{ .original = {} }; + } + + fn deinit(self: UTF8ConsoleOutput) void { + if (builtin.os.tag == .windows) { + // Restore the original code page + _ = std.os.windows.kernel32.SetConsoleOutputCP(self.original); + } + } +};