diff --git a/src/PVE/CLIFormatter.pm b/src/PVE/CLIFormatter.pm index ca4ee08..d93bed6 100644 --- a/src/PVE/CLIFormatter.pm +++ b/src/PVE/CLIFormatter.pm @@ -380,7 +380,8 @@ sub print_api_result { } if ($format eq 'yaml') { - print encode('UTF-8', YAML::XS::Dump($data)); + # Note: YAML::XS already returns UTF-8 encoded output + print YAML::XS::Dump($data); } elsif ($format eq 'json') { # Note: we always use utf8 encoding for json format print to_json($data, { utf8 => 1, allow_nonref => 1, canonical => 1 }) . "\n"; diff --git a/test/format_test.pl b/test/format_test.pl index 7b461ef..8ccfd5a 100644 --- a/test/format_test.pl +++ b/test/format_test.pl @@ -7,6 +7,7 @@ use lib '../src'; use PVE::JSONSchema; use PVE::CLIFormatter; +use Encode qw(decode); use Test::More; use Test::MockModule; @@ -53,4 +54,18 @@ foreach my $data (@$render_data) { is($actual, $expected, "string format '$renderer_name'"); } +# test that non-ASCII characters survive the structured output formats +my $unicode_data = { description => "Erkl\x{e4}rung" }; +for my $format (qw(json yaml)) { + open(my $fh, '>', \my $output) or die "failed to open in-memory file - $!\n"; + my $stdout = select($fh); + PVE::CLIFormatter::print_api_result( + $unicode_data, undef, undef, { 'output-format' => $format }, {}, + ); + select($stdout); + close($fh); + + like(decode('UTF-8', $output), qr/Erkl\x{e4}rung/, "output format '$format' is UTF-8 encoded"); +} + done_testing();