Re: badly calculated width of emoji in psql
Jacob Champion <pchampion@vmware.com>
From: Jacob Champion <pchampion@vmware.com>
To: "pavel.stehule@gmail.com" <pavel.stehule@gmail.com>, "laurenz.albe@cybertec.at" <laurenz.albe@cybertec.at>, "michael@paquier.xyz" <michael@paquier.xyz>
Cc: "pgsql-hackers@postgresql.org" <pgsql-hackers@postgresql.org>, "horikyota.ntt@gmail.com" <horikyota.ntt@gmail.com>
Date: 2021-07-21T22:12:51Z
Lists: pgsql-hackers
Attachments
- ucs_wcwidth-update-Fullwidth-and-Wide-codepoint-set.patch (text/x-patch) patch
On Wed, 2021-07-21 at 00:08 +0000, Jacob Champion wrote: > I note that the doc comment for ucs_wcwidth()... > > > * - Spacing characters in the East Asian Wide (W) or East Asian > > * FullWidth (F) category as defined in Unicode Technical > > * Report #11 have a column width of 2. > > ...doesn't match reality anymore. The East Asian width handling was > last updated in 2006, it looks like? So I wonder whether fixing the > code to match the comment would not only fix the emoji problem but also > a bunch of other non-emoji characters. Attached is my attempt at that. This adds a second interval table, handling not only the emoji range in the original patch but also correcting several non-emoji character ranges which are included in the 13.0 East Asian Wide/Fullwidth sets. Try for example - U+2329 LEFT POINTING ANGLE BRACKET - U+16FE0 TANGUT ITERATION MARK - U+18000 KATAKANA LETTER ARCHAIC E This should work reasonably well for terminals that depend on modern versions of Unicode's EastAsianWidth.txt to figure out character width. I don't know how it behaves on BSD libc or Windows. The new binary search isn't free, but my naive attempt at measuring the performance hit made it look worse than it actually is. Since the measurement function was previously returning an incorrect (too short) width, we used to get a free performance boost by not printing the correct number of alignment/border characters. I'm still trying to figure out how best to isolate the performance changes due to this patch. Pavel, I'd be interested to see what your benchmarks find with this code. Does this fix the original issue for you? --Jacob
Commits
-
Extend collection of Unicode combining characters to beyond the BMP
- 5bc429aacb37 15.0 landed
-
Update display widths as part of updating Unicode
- bab982161e05 15.0 landed
-
Revert "Rename unicode_combining_table to unicode_width_table"
- 1563ecbc1be8 15.0 landed
-
Change mbbisearch to return the character range
- 78ab944cd4b9 15.0 landed