#include #include #include void printUnicode(const QString &str) { for (int i = 0; i < str.length(); ++i) printf(" U+%04X", str.unicode()[i].unicode()); } int main(int argc, char **argv) { setlocale(LC_ALL, ""); QString source = QString::fromLocal8Bit(argv[1]); QString composed = source.normalized(QString::NormalizationForm_C); QString decomposed = source.normalized(QString::NormalizationForm_D); printf("Source form:"); printUnicode(source); printf("\nComposed form:"); printUnicode(composed); printf("\nDecomposed form:"); printUnicode(decomposed); printf("\n categories:"); for (int i = 0; i < decomposed.length(); ++i) printf(" %6d", decomposed.unicode()[i].category()); printf("\n"); return 0; } $ /tmp/decomposition/decomposition abcáé€. Source form: U+0061 U+0062 U+0063 U+00E1 U+00E9 U+20AC U+002E Composed form: U+0061 U+0062 U+0063 U+00E1 U+00E9 U+20AC U+002E Decomposed form: U+0061 U+0062 U+0063 U+0061 U+0301 U+0065 U+0301 U+20AC U+002E categories: 16 16 16 16 1 16 1 28 26