https://bugs.winehq.org/show_bug.cgi?id=9583
--- Comment #23 from Virgo Pärna virgo@gaiasoft.ee --- This is starting to get quite complex. If I understand correctly, then compare_unicode_weights is supposed to give same result for A and Ä. But then compare_diacritic_weights should show the difference. Just for testing I extracted relavent parts from wine and I made a test program to see, what happens. And it seems that those lines: ce1 = collation_table[collation_table[*str1 >> 8] + (*str1 & 0xff)]; ce2 = collation_table[collation_table[*str2 >> 8] + (*str2 & 0xff)]; give the same result for A and Ä. And that part is exactly same in compare_unicode_weights and compare_diacritic_weights and compare_case_weights. So that would always give same results AFAIU. And I really don't understand, what part of the http://www.unicode.org/reports/tr10/allkeys.txt collation.c contains.
From the allkeys.txt
0041 ; [.0A15.0020.0008.0041] # LATIN CAPITAL LETTER A 00C1 ; [.0A15.0020.0008.0041][.0000.0032.0002.0301] # LATIN CAPITAL LETTER A WITH ACUTE; QQCM
How does this information translate to collation_table? My perl is unfortunately even worse than my C. But as far as I understand the array is generated in make_unicode script.