pbot-vm: display escaped malformed Unicode in output instead of U+FFFD

This commit is contained in:
Pragmatic Software 2022-04-04 21:54:39 -07:00
parent 757088987d
commit 5bc47b61d9
2 changed files with 11 additions and 4 deletions

View File

@ -153,12 +153,19 @@ sub gdbmi_to_hash($text, $makejson = 1) {
# when and why the backslashes double up)
$text =~ s/\\+(\d{3})/$1 >= 0x20 ? chr oct $1 : "\\\\$1"/ge;
# fix unicode
my $octets = decode('UTF-8', $text, Encode::FB_DEFAULT);
# escape malformed unicode
my $octets;
while (1) {
$octets .= decode('UTF-8', $text, Encode::FB_QUIET);
last if not length $text;
$text =~ s/(.)/sprintf '\\\\x%X', ord $1/e;
}
$text = encode('UTF-8', $octets, Encode::FB_CROAK);
# escape invalid JSON characters
$text =~ s/([\x10-\x1f])/sprintf '\\\\x{%x}', ord $1/ge;
$text =~ s/([\x10-\x1f])/sprintf '\\\\x%X', ord $1/ge;
# return hashtable decoded from json
return decode_json("{$text}");

View File

@ -25,7 +25,7 @@ use PBot::Imports;
# These are set by the /misc/update_version script
use constant {
BUILD_NAME => "PBot",
BUILD_REVISION => 4523,
BUILD_REVISION => 4524,
BUILD_DATE => "2022-04-04",
};