Follow @Openwall on Twitter for new release announcements and other news
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20180123233857.GW1627@brightrain.aerifal.cx>
Date: Tue, 23 Jan 2018 18:38:57 -0500
From: Rich Felker <dalias@...c.org>
To: musl@...ts.openwall.com
Subject: Re: Updating Unicode support

On Mon, Jan 22, 2018 at 05:54:49PM -0800, Eric Pruitt wrote:
> NOTE: When I first started writing this email, I didn't realize musl's
> Unicode property table had recently been updated, but I noticed
> <https://git.musl-libc.org/cgit/musl/commit/?id=c72c1c5> when I was
> looking up commit IDs to cite. I'm leaving most of the verbiage below
> unchanged since I think it adds useful context.

OK. With this in mind, I hope you're also aware that musl's Unicode
tables are all highly optimized for size and (aside from case mapping)
very good speed relative to their size, and are generated mechanically
from the UCD files via some ugly code here:

https://github.com/richfelker/musl-chartable-tools

If someone wants to make local changes or upgrade to newer Unicode
before it's upstream in musl, these tools generally provide the best
way to do it.

> The Unicode property data used by musl has not been updated in quite
> some time, and due to changes introduced in recent publications of the
> Unicode standard, musl's width data is incorrect for many symbols --
> notably emoji.

If you mean that emoji should be considered double-width, I agree with
that in principle, but everything has to *agree* upon widths in order
for them to work. If not, terminal contents just get corrupted when
programs or systems that disagree try to communicate. It would take a
coordinated effort with glibc, third-party libraries, and programs
like screen that ship their own wcwidth-equivalent tables to redefine
them as double-width, and ideally there should probably be some
Unicode recommendation to document the change.

Note that musl assumes all characters that aren't already defined as
control or nonspacing are single-width, except in the extended CJK
planes where it assumes they're double-width, so lack of support for
latest Unicode is only a problem when new nonspacing characters are
added or when wide characters are added outside the CJK planes.

> This can lead to rendering glitches in terminals when
> some applications are not built with musl; for example, my terminal
> emulator is dynamically linked against a version of GNU libc that
> supports Unicode 9 (released June 21, 2016) whereas musl's table was
> lasted updated in 2011 or 2012 (commit 1b0ce9a).

Do you have an example of characters that caused the problem? I'd like
to better understand how it came up. Maybe glibc is already doing
something different than what I think they're doing.

> To resolve this problem, I wrote a drop-in replacement for musl's
> wcwidth(3) implementation that uses utf8proc
> (https://github.com/JuliaLang/utf8proc) as the source of truth. You can
> find the code for this at
> <https://github.com/ericpruitt/static-unix-userland/blob/42cbdbb/utf8proc-wcwidth/utf8proc-wcwidth.c>.
> I am wondering if the musl developers would consider accepting a patch
> that implements optional / configurable support for utf8proc. The
> utf8proc-wcwidth.c file I linked to includes some additional code
> unrelated to musl making it possible to use the file as an LD_PRELOAD
> library. The LD_PRELOAD stuff would **not** be include in the proposed
> patch. I'm also investigating implementing the Unicode Collation
> Algorithm (https://unicode.org/reports/tr10/) for wcscoll(3); would that
> be of interest?

Thanks for pointing out this library -- it looks like something we
might should add to the wiki as a recommended lib, and seems to
implement a lot of Unicode functionality that's otherwise only
available in gigantic bloated libraries like ICU. I'd like to take a
closer look at it when I get time.

Of course it's possible to drop it in to musl's tree locally like you
did as a hack, but this isn't something musl can really do due to both
namespace considerations (wcwidth depending on symbols not in reserved
namespace) and policy about not introducing config switches. But if
the table contents in utf8proc do differ from musl, you can always use
the chartable tools package to generate matching tables to drop into
musl.

Rich

Powered by blists - more mailing lists

Confused about mailing lists and their use? Read about mailing lists on Wikipedia and check out these guidelines on proper formatting of your messages.