Re: [precis] toLower() vs. toCaseFold()

John C Klensin <> Sat, 07 May 2016 02:40 UTC

Return-Path: <>
Received: from localhost (localhost []) by (Postfix) with ESMTP id 1754C12D1DB for <>; Fri, 6 May 2016 19:40:15 -0700 (PDT)
X-Virus-Scanned: amavisd-new at
X-Spam-Flag: NO
X-Spam-Score: -2.896
X-Spam-Status: No, score=-2.896 tagged_above=-999 required=5 tests=[BAYES_00=-1.9, RP_MATCHES_RCVD=-0.996] autolearn=ham autolearn_force=no
Received: from ([]) by localhost ( []) (amavisd-new, port 10024) with ESMTP id Kc8_V6p159Ve for <>; Fri, 6 May 2016 19:40:13 -0700 (PDT)
Received: from ( []) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by (Postfix) with ESMTPS id 8EBE612B029 for <>; Fri, 6 May 2016 19:40:13 -0700 (PDT)
Received: from [] ( by with esmtp (Exim 4.82 (FreeBSD)) (envelope-from <>) id 1aysA7-000MAC-4C; Fri, 06 May 2016 22:40:11 -0400
Date: Fri, 06 May 2016 22:40:06 -0400
From: John C Klensin <>
To: =?UTF-8?Q?Martin_J=2E_D=C3=BCrst?= <>, Peter Saint-Andre <>,
Message-ID: <>
X-Mailer: Mulberry/4.0.8 (Win32)
MIME-Version: 1.0
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline
X-SA-Exim-Scanned: No (on; SAEximRunCond expanded to false
Archived-At: <>
Subject: Re: [precis] toLower() vs. toCaseFold()
X-Mailman-Version: 2.1.17
Precedence: list
List-Id: Preparation and Comparison of Internationalized Strings <>
List-Unsubscribe: <>, <>
List-Archive: <>
List-Post: <>
List-Help: <>
List-Subscribe: <>, <>
X-List-Received-Date: Sat, 07 May 2016 02:40:15 -0000

(sorry... earlier copy sent from wrong address)

--On Friday, May 06, 2016 15:54 +0900 "Martin J. Dürst"
<> wrote:

> Hello Peter,
> On 2016/05/05 07:43, Peter Saint-Andre wrote:
>> I suggested that we add some text about this to 7564bis. Here
>> is a proposed paragraph for insertion in §5.2.3
>> ("Case-Mapping Rule"):
>>    The Unicode toCaseFold() operation defined by the Unicode
>>    Default Case Folding algorithm is most appropriate when an
>>    application needs to compare two strings.  When an
>>    application merely wishes to convert uppercase and
>>    titlecase code points to the lowercase equivalents while
>>    preserving lowercase code points, the Unicode toLower()
>>    operation is more appropriate and is less likely to
>>    violate the "Principle of Least Astonishment".  Therefore,
>>    application developers are advised to carefully consider
>>    whether they truly need to use the toCaseFold() operation
>>    in a given situation, or whether the toLower() operation
>>    would be more appropriate than the toCaseFold() operation.
>> Suggestions for improvement are welcome, especially from
>> John. (E.g., we might want to more explicitly call out
>> comparison vs. other contexts in the normative text elsewhere
>> in §5.2.3).
> I think 'compare' should be changed to 'search'. That's the
> prototypical use case for CaseFold.

Hmm.  If we have to choose, I think I prefer "compare".  I just
looked at the subsections on "Default Case Folding" and "Default
Caseless Matching" in Section 3.13 of TUS 8.0 and it says a lot
about comparison and nothing about search.   Recommended
compromise:  Make the relevant sentence fragment read "most
appropriate when an application needs to compare two strings
such as in search operations."

I'd still prefer to denounce toCaseFold completely, especially
where identifiers are concerned.  It just has far too much
potential for being destructive and creating false results
(either positive or negative) when the language context is
unknown.  People/designers/implementers who are not prepared to
understand those issues and their implications should really not
be using the thing.

> Also, the language in the "Therefore" sentence is somewhat
> convoluted. It's unclear which alternative this text prefers.
> I suggest that if we want to put the two alternatives on an
> equal footing (i.e. make sure the application designer thinks
> carefully), then a more parallel sentence structure, avoiding
> words such as "carefully", "truly", and "would", would be more
> appropriate. What about:
>                                         Therefore, application
> developers
>     are advised to carefully consider whether toCaseFold() or
>     toLower() is more appropriate.

For the reasons above, I'm not sure that an even footing is
appropriate.  I'd rather have the guidance be closer to "use
toLowerCase, which your users are likely to understand, unless
you need CaseFolding for some particular reason and understand
its implications"