poppler/PDFDoc.cc | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-)
New commits: commit 48c6eee27a7a6439507dc28df983f1d55efa6a9a Author: Albert Astals Cid <aa...@kde.org> Date: Thu Mar 17 17:50:55 2022 +0100 Write unicode strings using PDF hexadecimal strings As far as I can see our old way of doing it was correct but when saving contents like 我不会复印 ( i'm sure this is going to break, so check it on https://bugs.kde.org/show_bug.cgi?id=378186 ) Adobe Reader would not read the string back correctly. mupdf works both with the old and the new code diff --git a/poppler/PDFDoc.cc b/poppler/PDFDoc.cc index 6580fc1f..20bb191f 100644 --- a/poppler/PDFDoc.cc +++ b/poppler/PDFDoc.cc @@ -70,7 +70,9 @@ #include <cstddef> #include <cstring> #include <ctime> +#include <iomanip> #include <regex> +#include <sstream> #include <sys/stat.h> #include "goo/glibc.h" #include "goo/gstrtod.h" @@ -1277,16 +1279,14 @@ void PDFDoc::writeString(const GooString *s, OutStream *outStr, const unsigned c if (s->hasUnicodeMarker()) { // unicode string don't necessary end with \0 const char *c = s->c_str(); - outStr->printf("("); + std::stringstream stream; + stream << std::setfill('0') << std::hex; for (int i = 0; i < s->getLength(); i++) { - char unescaped = *(c + i) & 0x000000ff; - // escape if needed - if (unescaped == '(' || unescaped == ')' || unescaped == '\\') { - outStr->printf("%c", '\\'); - } - outStr->printf("%c", unescaped); + stream << std::setw(2) << (0xff & (unsigned int)*(c + i)); } - outStr->printf(") "); + outStr->printf("<"); + outStr->printf("%s", stream.str().c_str()); + outStr->printf("> "); } else { const char *c = s->c_str(); outStr->printf("(");