www.delorie.com/archives/browse.cgi   search  
Mail Archives: cygwin/2026/06/01/11:59:37

DMARC-Filter: OpenDMARC Filter v1.4.2 delorie.com 651FxaUC3665066
Authentication-Results: delorie.com; dmarc=pass (p=none dis=none) header.from=cygwin.com
Authentication-Results: delorie.com; spf=pass smtp.mailfrom=cygwin.com
DKIM-Filter: OpenDKIM Filter v2.11.0 delorie.com 651FxaUC3665066
Authentication-Results: delorie.com;
dkim=pass (1024-bit key, unprotected) header.d=cygwin.com header.i=@cygwin.com header.a=rsa-sha256 header.s=default header.b=MCMfiMHe
X-Recipient: archive-cygwin AT delorie DOT com
DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org A277B4BA2E23
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=cygwin.com;
s=default; t=1780329575;
bh=B2AvTJc35t7QWul3a0EoC1QVjsaEUKiFxziq1AdwWDM=;
h=Date:Subject:To:References:In-Reply-To:List-Id:List-Unsubscribe:
List-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To:
From;
b=MCMfiMHeckNDx6UNVCEWCMUnuWkCyn9dP3BJJiZVxFiF2tyLzNnp2PcSzRevQN4aU
mO12gH4HOJbxUCc4k/Gako76PzCk3CYAFGhawqRph8bG1jhvvVFqF1LJH5ssrb9NFg
JDOilywnYiZFEdWfsPbwGvn4dNVT6wbSZS5dGAck=
X-Original-To: cygwin AT cygwin DOT com
Delivered-To: cygwin AT cygwin DOT com
DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org CAEF04BA2E15
ARC-Filter: OpenARC Filter v1.0.0 sourceware.org CAEF04BA2E15
ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1780329556; cv=none;
b=tipvi6gKRAPc6O28RPNclp3HXSjr/tqDuIOE3gTTEgGgy2QiiMhRol/A0JEaaOAfIJnuH4UK7CtBuukoutq+h0HPDDx8SPUPD+xl3ihzJQD2VTZPkFaVbcehvDV2SPRhHfrba34+C2+rGnOSgViII4RXcYPUghzl3pZuSoGMeH0=
ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key;
t=1780329556; c=relaxed/simple;
bh=fQZy3ATrtrxcqa2fEj7G+i5gb11yYBxh09NDFRLGZ0Q=;
h=DKIM-Signature:Message-ID:Date:MIME-Version:Subject:To:From;
b=pyekTGDjYqc7Iks/8C+XhFzo6lUGQzUybORjqajw6roFQOkXMtd1RGzHzkIkn2gQzl/ZzfzCnPlVlfSSki2bwwFp3Va8f/hwzpjWKjxtb5E4midvLGnCi1Bw7SlLvYueKtdCfOMamQT9ERSCkNioGwXpPzioCRvugZewtBfrb9I=
ARC-Authentication-Results: i=1; sourceware.org;
dkim=pass (2048-bit key, unprotected)
header.d=towo.net header.i=towo AT towo DOT net header.a=rsa-sha256
header.s=s1-ionos header.b=XK+s/VSX
DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org CAEF04BA2E15
X-UI-Sender-Class: 55c96926-9e95-11ee-ae09-1f7a4046a0f6
Message-ID: <b5b175eb-1225-43cf-bda1-eef0cc9cff78@towo.net>
Date: Mon, 1 Jun 2026 17:59:14 +0200
MIME-Version: 1.0
User-Agent: Mozilla Thunderbird
Subject: Re: Thoughts on the wcwidth confusion
To: cygwin AT cygwin DOT com
References: <19c6f9b4-5f09-6929-891c-d25ebe48af82 AT wisemo DOT com>
Autocrypt: addr=towo AT towo DOT net; keydata=
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 kQ==
In-Reply-To: <19c6f9b4-5f09-6929-891c-d25ebe48af82@wisemo.com>
X-Provags-ID: V03:K1:eIaGVou/ZQHwY/azOfHt2wjSMFzS7UfksKQQCF8vTE7phzlIqSb
3ecc8PGGX9jcfxWuf4FHMmUqSwBY84yjiHmssbHfZjSG8RbE9xh+ppIJFmmUBx25/9eAGv/
8RFr0f38KFPDK1NeROwbyJ1yWZNaDtS5JhiHzbaumhTVHK5IXGnX34I252AH9C3zf92tAOv
ymRGVA9FsVROrTM2s6YGw==
UI-OutboundReport: notjunk:1;M01:P0:uDMhiHQmr0A=;2bBqRsJIcXAkDDjun8PUnrnM8Du
ny9wwf2x+U0IZCTjEZjRlKa5qHD3sIxNWQZfzRCHYGKCY/+oaPtLkfQ7lCDnM4XabFRisfSWa
TJTdGf62W6Y1qt0uosgo07PUZ0DhMa0Yzv44iykO81uUSKpwE7IavbHWkCNSk+1KUyYoPCzZg
htzFqRe00nghmcLtlew1pMTcjhldadU58IKRs2tnavN3OJ3HEK8zJTknzOGxVbfJ9sLK5WHu3
nzKQsrZxx88W0K1gjm5L5zkf2Lnyt+OJhAr3aN3ppgC/RWZiYESrl9YUiIxRPRWa3qbVCDXH2
eeiDjotS/XgK0fbCkas4QKRgwrgiJjbBDu0id9GvY1ftFc29+bSpg1dqvZarTESsGYNPk3XTS
iFUnBwDWF6dZdT51ZNKoenO2peWXoU+ON5JtMwP69BgNe/ooA1EICcMDByr17/GVnATUTaBsx
n1adhMtchfXWWGzAcPLsDUdJ2qat1UBi4AD7nJ31sgoISZ7ovt/64UthEDA7Bszoki4iYo6Av
NEW3ZEIU0vqYa0sf7m4lb7X50Yow+HejFwY1105P8LDMoWcK29wnaMKIGphdbIlvl3+u8Tk79
m9752AA6YRtACIrbGuufEK1zXnMQynfqSc4JYb5/LmuraCMtQDBn3MaTfaqI7DCSmva7mVgGH
0murWKOV0iSIcTirWmqyc88ZDSIEfO8WKpNJ53/YospPBz2qTOSDJl9JPoFlxQPHiSQqmvfxP
ysFt14rWDSyVA/HZsxIx3q8YLOZrIHf+B+gUxjpmnVS2fzA4+wFhTcCsQtAR/egsq5BJSkgiP
AhZEY+/W/P3sAgFdCcLfWLiYx5U2U9HazrL35eGX3QYUjl7VAHGGUVx6fRKo6HpFqq+qx4sPF
p17ZkNViol+lXDat/9Y2OW81TUYRNqbl0gcYmulAzTTvNbYsmTskMeNlpcPsxjrK9DxFl2/VO
hXZpPzxQhjBAP2wLx+1ZhyLuso1CG2+q6tQAydwVZmxkbn11OhUf6HqXoXWVr/1TpFbKYfRAv
KHEvm3Xwrhh56KPBwhEUSEiA1w02aDMZ30lDD3jE04KW/Lt4EW7AAUGohNvL6z2mnK9vg59r1
k2NxWCvYrJUCOMa6WqyDio7Kc8kUCClDtb/5VRO50XoFh7xikdVW3PfA40Jz4ll3EalQFpHu1
vP6v8lI+dfGKnZuf12aDnnDILa3goDrird951BNBCa3w5TbtBE/hNPCpkFT4rUpAutw2EZ6KV
6n6rxQej9iynjpZ5TNTx++LqSzQeCIN28JeGHlqpFG7wPt1XNzGcMptSS1ML/GetYQIRisSZu
Ugl5eOB1ckyYl2pdMMqLc6CqF33ki4LtIT9LG/30lf6X1PV2ToYywkeQeTtqZm6j/tIs1AowC
9x50l6ZQmuffGGxJUSD8DVCsMVv5wVRXkkvr6UEMFnSkJ8JajyR4+JLKAj4+QSjQ6J/jMI0RT
BcioDnIuL6sOUSud5Zf4rXMP4N2YQb2+sQaGDgSNBJcJSoPKfiLF+T8Nc+frqWWmWatf4EAuX
KmglY+FNwL4cvBjA+wI4aKJIZck2AgrtO+H/AArdxhIVQZ+wayfeRJr9ejs5d4qSt2mAS3f9Q
jEYHuTS6t63nlYfd6OmuHIZhyGSvWUwRHdiWJt+1JivfHvPiihOCAiwc7SGXXZWZjI895U0yx
L/KBTDQyHw9io6g/PY9CrPnuIFBGayrhRkPDnFLYa7OjTcYoJU9Bti2MQ/9HSiDLOLeJxdcBz
pkmWP8ULA5khaq+KTyt+ORIefKFwrxlNgJCVmssW0q19hohnGBgQLDMlA3/83HXvu7YTPr+m/
Fzh5/kPmMkBys+PXn8FQyh26g2eqN8cCFTKxt905sG3ab4jn4DuJeNA2r2/roETDkhesCreQv
1ri1msopnCYvcRUnwat4YftCU0itKbpAtbNx/Q6c5phVO9gKC91CrO/PMjj
X-BeenThere: cygwin AT cygwin DOT com
X-Mailman-Version: 2.1.30
List-Id: General Cygwin discussions and problem reports <cygwin.cygwin.com>
List-Unsubscribe: <https://cygwin.com/mailman/options/cygwin>,
<mailto:cygwin-request AT cygwin DOT com?subject=unsubscribe>
List-Archive: <https://cygwin.com/pipermail/cygwin/>
List-Post: <mailto:cygwin AT cygwin DOT com>
List-Help: <mailto:cygwin-request AT cygwin DOT com?subject=help>
List-Subscribe: <https://cygwin.com/mailman/listinfo/cygwin>,
<mailto:cygwin-request AT cygwin DOT com?subject=subscribe>
From: Thomas Wolff via Cygwin <cygwin AT cygwin DOT com>
Reply-To: Thomas Wolff <towo AT towo DOT net>
Errors-To: cygwin-bounces~archive-cygwin=delorie DOT com AT cygwin DOT com
Sender: "Cygwin" <cygwin-bounces~archive-cygwin=delorie DOT com AT cygwin DOT com>
X-MIME-Autoconverted: from base64 to 8bit by delorie.com id 651FxaUC3665066

Am 01.06.2026 um 17:34 schrieb Jakob Bohm via Cygwin:
> Dear list,
>
> Having read through the recent debate around the wcwidth() POSIX API,
> wchar_t definitions, gcc-16 and cygwin, I have an idea not
> mentioned in the list so far:
>
> Using C17 types char32_t and char16_t, the situation can be
> summarized as follows:
>
> - Many, but not all POSIX systems define wchar_t as char32_t and thus
> wint_t as uint_least32_t
>
> - Win32 and thus Cygwin defines wchar_t as char16_t and thus wint_t as
> uint_least16_t
>
> - All systems considered treat wchar_t as unicode, with Win32 supporting
>  UTF-16 since the NT 5.00 (Windows 2000).
>
> - For char16_t/UTF-16, wcwidth() should use the high surrogate to
>  determine the range of unicode symbols and return a width common to
>  that range, then return 0 for the low surrogates, thereby allowing
>  computation of string width without having to first assemble surrogates
>  into full char32_t values.  Deciding if char32_t implementations should
>  still lump groups of 4 Unicode rows for UTF-16 compatibility is up to
>  each implementation.
It's a neat idea to split the width calculation over the surrogates. 
Unfortunately it does not work this way because widthness does not 
change in full 1024-byte blocks. For example, U+1F4FC is Wide, U+1F4FD 
and U+1F4FE are narrow/Neutral (N), and U+1F4FF is W again.
As a variant of your idea, wcwidth could return width 1 for every high 
surrogate, remember it, and if the subsequent invocation is a low 
surrogate, determine the combined width and return either 1 or 0.
Not quite standard behaviour, I suspect, so maybe not a good idea for 
the purists, but maybe worth some discussion.

>
> A practical solution would be for Cygwin/newlib to provide new functions
> c16width(), c32width(), c16swidth() and c32swidth(), each being the
> explicit size equivalants of their wc and wcs similarly named functions.
>
> Then wcwidth() can be a trivial inline alias of the explicit size
> equivalent for the compile target by having the newlib header checking a
> compiler or standard define indicating the chosen size of wchar_t.
>
> // possible wchar.h snippet
> //
> // C17+ required
> // For C2Y+ this should go in uchar.h
> //
> int c16width(char16_t c);
> int c32width(char32_t c);
> int c16swidth(const char16_t *s, size_t n);
> int c32swidth(const char32_t *s, size_t n);
>
> // ...
>
> // This belongs in wchar.h for C1x- compat
> //
> #if SOMETHING_MEANING_16bit_WCHAR_T
> inline int wcwidth(wchar_t c) {
>   return c16width(c);
> }
> inline int wcswidth(const wchar_t *s, size_t n)
> {
>   return c16swidth(s, n);
> }
> #else
> inline int wcwidth(wchar_t c) {
>   return c32width(c);
> }
> inline int wcswidth(const wchar_t *s, size_t n)
> {
>   return c32swidth(s, n);
> }
> #endif
>
>
> Enjoy
>
> Jakob


-- 
Problem reports:      https://cygwin.com/problems.html
FAQ:                  https://cygwin.com/faq/
Documentation:        https://cygwin.com/docs.html
Unsubscribe info:     https://cygwin.com/ml/#unsubscribe-simple

- Raw text -


  webmaster     delorie software   privacy  
  Copyright © 2019   by DJ Delorie     Updated Jul 2019