From db26cf804e3380b5e9caed3a33d640b8e8a54835 Mon Sep 17 00:00:00 2001 From: Just van Rossum Date: Sat, 16 May 2020 11:29:23 +0200 Subject: [PATCH] [ttLib.name] Fix findMultilingualName() (#1963) * when reading from binary, name.string may be an encoded bytes sequence: we should call toUnicode() before we compare to the requested string * fix expected output --- Lib/fontTools/ttLib/tables/_n_a_m_e.py | 7 +++++-- Tests/ttLib/tables/_n_a_m_e_test.py | 14 ++++++++++++++ Tests/varLib/data/test_results/BuildTestCFF2.ttx | 10 +++++----- 3 files changed, 24 insertions(+), 7 deletions(-) diff --git a/Lib/fontTools/ttLib/tables/_n_a_m_e.py b/Lib/fontTools/ttLib/tables/_n_a_m_e.py index ec5d07eeb..3f756c8f0 100644 --- a/Lib/fontTools/ttLib/tables/_n_a_m_e.py +++ b/Lib/fontTools/ttLib/tables/_n_a_m_e.py @@ -222,8 +222,11 @@ class table__n_a_m_e(DefaultTable.DefaultTable): # Collect matching name IDs matchingNames = dict() for name in self.names: - key = (name.string, name.platformID, - name.platEncID, name.langID) + try: + key = (name.toUnicode(), name.platformID, + name.platEncID, name.langID) + except UnicodeDecodeError: + continue if key in reqNameSet: nameSet = matchingNames.setdefault(name.nameID, set()) nameSet.add(key) diff --git a/Tests/ttLib/tables/_n_a_m_e_test.py b/Tests/ttLib/tables/_n_a_m_e_test.py index 5f5c965ce..c0275e7b1 100644 --- a/Tests/ttLib/tables/_n_a_m_e_test.py +++ b/Tests/ttLib/tables/_n_a_m_e_test.py @@ -166,6 +166,20 @@ class NameTableTest(unittest.TestCase): self.assertEqual(nameID, table.findMultilingualName(namesSubSet)) self.assertEqual(None, table.findMultilingualName(namesSuperSet)) + def test_findMultilingualName_compiled(self): + table = table__n_a_m_e() + names, namesSubSet, namesSuperSet = self._get_test_names() + nameID = table.addMultilingualName(names) + assert nameID is not None + # After compile/decompile, name.string is a bytes sequence, which + # findMultilingualName() should also handle + data = table.compile(None) + table = table__n_a_m_e() + table.decompile(data, None) + self.assertEqual(nameID, table.findMultilingualName(names)) + self.assertEqual(nameID, table.findMultilingualName(namesSubSet)) + self.assertEqual(None, table.findMultilingualName(namesSuperSet)) + def test_addMultilingualNameReuse(self): table = table__n_a_m_e() names, namesSubSet, namesSuperSet = self._get_test_names() diff --git a/Tests/varLib/data/test_results/BuildTestCFF2.ttx b/Tests/varLib/data/test_results/BuildTestCFF2.ttx index 290445250..9f7d6388c 100644 --- a/Tests/varLib/data/test_results/BuildTestCFF2.ttx +++ b/Tests/varLib/data/test_results/BuildTestCFF2.ttx @@ -27,31 +27,31 @@ - + - + - + - + - +