It should be noted that the algorithmic complexity for this NFLD
normalization ("legacy") is exactly the same as for NFKD ("compatibility").However NFLD is versioned (like also NFLC), so NFLD can take a second parameter: the maximum Unicode version which can be used to filter which decomposition mappings are usable (they indicate the first minimal version where the mapping applies). It is even possible to allow a "legacy" normalization to be changed in a later version for the same source string: # deprecated codepoint(s) ; new preferred sequence ; Unicode version in which it was deprecated 101234 ; 101230 0300... ; 10.0 101234 ; 101240 0301... ; 11.0 It is also possible to add other filters to these recommanded new encodings, for example a language (or a BCP 47 locale identifier): 101234 ; 101230 0300 ; 10.0 ; fr 101234 ; 101240 0301... ; 10.0 (here starting in the same version 10.0, the new recommandation is to replace <101234> by <101240 0301> in all languages except French (BCP47 rules) where <101230 0300> should be used instead). In that case, the NFKD normalization can be viewed as if it was an historic version of NFLD, or a specialisation of NFLD for a "compatibility locale" (using "u-nfk" as a BCP 47 locale identifier???), independant of the unicode version (you can specify any version in the parameters of the NFLD or NFLC functions, and the locale identifier can be set to "u-nkf"). The complete parameters for NFLD (or NFLC) are : NFLD(text, version, locale) -> returns a text in NFD form NFLC(text, version, locale) -> returns a text in NFC form The default version is the latest supported version of Unicode, the default locale is "root" (in CLDR) or the same as the DUCET in Unicode, but should not be "u-nfk". And so: NFKD(text) = NFLD(text, 8.0, "u-nfk") = NFLD(text, 12.0, "u-nfk") = NFLD(text, "u-nfk") = NFD(NFLD(text, "u-nfk")) NFKC(text) = NFLC(text, 8.0, "u-nfk") = NFLC(text, 12.0, "u-nfk") = NFLC(text, "u-nfk") = NFC(NFLC(text, "u-nfk"))

