[Libreoffice-commits] core.git: Branch 'distro/collabora/cp-6.4' - tools/source
Tor Lillqvist (via logerrit)
logerrit at kemper.freedesktop.org
Sat Jan 16 14:08:41 UTC 2021
tools/source/misc/json_writer.cxx | 18 +++++++++++++++---
1 file changed, 15 insertions(+), 3 deletions(-)
New commits:
commit 5db3e8596254cf5a2e1c66e2d9dd7e5a347fcc03
Author: Tor Lillqvist <tml at collabora.com>
AuthorDate: Fri Jan 15 03:03:41 2021 +0200
Commit: Tor Lillqvist <tml at collabora.com>
CommitDate: Sat Jan 16 15:08:07 2021 +0100
Make JsonWriter::writeEscapedOUString() handle surrogate pairs properly
It is wrong to iterate over UTF-16 code units one by one. We have
OUString::iterateCodePoints() to iterate over Unicode code points.
The two UTF-16 code units of a surrogate pair (for a non-BMP code
point) should not be encoded separately to UTF-8 bytes. It is the code
point that should be encoded (to four bytes).
Change-Id: Ica4341308deb6618c9c2da8dcee8a11ef4e8238d
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/109318
Tested-by: Jenkins
Reviewed-by: Noel Grandin <noel.grandin at collabora.co.uk>
Reviewed-by: Tor Lillqvist <tml at collabora.com>
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/109425
Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoffice at gmail.com>
diff --git a/tools/source/misc/json_writer.cxx b/tools/source/misc/json_writer.cxx
index be891ef18423..d1e1997320a1 100644
--- a/tools/source/misc/json_writer.cxx
+++ b/tools/source/misc/json_writer.cxx
@@ -134,9 +134,10 @@ void JsonWriter::put(const char* pPropName, const OUString& rPropVal)
mPos += 4;
// Convert from UTF-16 to UTF-8 and perform escaping
- for (int i = 0; i < rPropVal.getLength(); ++i)
+ sal_Int32 i = 0;
+ while (i < rPropVal.getLength())
{
- sal_Unicode ch = rPropVal[i];
+ sal_uInt32 ch = rPropVal.iterateCodePoints(&i);
if (ch == '\\')
{
*mPos = static_cast<char>(ch);
@@ -163,7 +164,7 @@ void JsonWriter::put(const char* pPropName, const OUString& rPropVal)
*mPos = 0x80 | (ch & 0x3F); /* 10xxxxxx */
++mPos;
}
- else
+ else if (ch <= 0xFFFF)
{
*mPos = 0xE0 | (ch >> 12); /* 1110xxxx */
++mPos;
@@ -172,6 +173,17 @@ void JsonWriter::put(const char* pPropName, const OUString& rPropVal)
*mPos = 0x80 | (ch & 0x3F); /* 10xxxxxx */
++mPos;
}
+ else
+ {
+ *mPos = 0xF0 | (ch >> 18); /* 11110xxx */
+ ++mPos;
+ *mPos = 0x80 | ((ch >> 12) & 0x3F); /* 10xxxxxx */
+ ++mPos;
+ *mPos = 0x80 | ((ch >> 6) & 0x3F); /* 10xxxxxx */
+ ++mPos;
+ *mPos = 0x80 | (ch & 0x3F); /* 10xxxxxx */
+ ++mPos;
+ }
}
*mPos = '"';
More information about the Libreoffice-commits
mailing list