When writing into the file, explicitly utf8 encode it, and then try
to utf8 decode it on read.
If the notes are not valid utf8, we assume they were iso-8859 encoded
and return as is.
Technically this is a breaking change, since there are iso-8859
comments that would successfully decode as utf8, for example: the
byte sequence "C2 A9" would be "£" in iso, but would decode to "£".
From what i can tell though, this is rather unlikely to happen for
"real world" notes, because the first byte would be in the range of
C0-F7 (which are mostly language dependent characters like "Â") and
the following bytes would have to be in the range of 80-BF, which are
only special characters like "£" (or undefined)
Signed-off-by: Dominik Csapak <d.csapak@proxmox.com>
use warnings;
use Cwd;
+use Encode qw(decode encode);
use File::Path;
use IO::File;
use POSIX;
my $path = $class->filesystem_path($scfg, $volname);
$path .= $class->SUPER::NOTES_EXT;
- return PVE::Tools::file_get_contents($path) if -f $path;
+ if (-f $path) {
+ my $data = PVE::Tools::file_get_contents($path);
+ return eval { decode('UTF-8', $data, 1) } // $data;
+ }
return '';
}
$path .= $class->SUPER::NOTES_EXT;
if (defined($notes) && $notes ne '') {
- PVE::Tools::file_set_contents($path, $notes);
+ my $encoded = encode('UTF-8', $notes);
+ PVE::Tools::file_set_contents($path, $encoded);
} else {
unlink $path or $! == ENOENT or die "could not delete notes - $!\n";
}
use strict;
use warnings;
+use Encode qw(decode);
use Fcntl ':mode';
use File::chdir;
use File::Path;
my $notes_fn = $original.NOTES_EXT;
if (-f $notes_fn) {
my $notes = PVE::Tools::file_read_firstline($notes_fn);
- $info->{notes} = $notes if defined($notes);
+ $info->{notes} = eval { decode('UTF-8', $notes, 1) } // $notes if defined($notes);
}
$info->{protected} = 1 if -e PVE::Storage::protection_file_path($original);