Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 23 Dec 1997 07:11:25 -0800 (PST)
From:      jose@we.lc.ehu.es
To:        freebsd-gnats-submit@FreeBSD.ORG
Subject:   bin/5368: the behavior of isprint(3) is not affected by ISO-8859-1 locale settings
Message-ID:  <199712231511.HAA12601@hub.freebsd.org>
Resent-Message-ID: <199712231520.HAA13046@hub.freebsd.org>

next in thread | raw e-mail | index | archive | help

>Number:         5368
>Category:       bin
>Synopsis:       the behavior of isprint(3) is not affected by ISO-8859-1 locale settings
>Confidential:   no
>Severity:       non-critical
>Priority:       medium
>Responsible:    freebsd-bugs
>State:          open
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Tue Dec 23 07:20:00 PST 1997
>Last-Modified:
>Originator:     Jose M. Alcaide
>Organization:
Universidad del Pais Vasco - Dept. Electricidad y Electronica
>Release:        2.2.5-RELEASE
>Environment:
FreeBSD tiburon.we.lc.ehu.es 2.2.5-RELEASE FreeBSD 2.2.5-RELEASE #0: Wed Oct 29 15:20:18 CET 1997     root@tiburon.we.lc.ehu.es:/usr/src/sys/compile/TIBURON  i386

>Description:
The setlocale(3) manual page says:

  ...
  LC_CTYPE     Set a locale for the ctype(3),  mbrune(3),  multibyte(3) and
               rune(3) functions.  This controls recognition of upper and
               lower case, alphabetic or non-alphabetic characters, and so
               on.  The real work is done by the setrunelocale() function.
  ...

However, if LANG is set to any locale that uses ISO-8859-1 character
coding, then isprint(c), where c is any printable char such as
ñ, é, ¡, ¿, and so on, returns 0 (not printable).

The incorrect behavior of isprint() affects vi(1). This editor relies
on isprint() to decide whether to display a character "as is", or
substitute it for its hex coding (\xDD).
>How-To-Repeat:
Edit and compile the following tiny program:

--------------------------------
#include <stdio.h>
#include <ctype.h>
#include <locale.h>

main()
{
        char c, *s;

        printf("Old locale: %s\n", setlocale(LC_CTYPE, NULL));

        if ((s = setlocale(LC_CTYPE, "")) == NULL)
        {
                fprintf(stderr, "setlocale() failed.\n");   
                exit(1);
        }
        else
                printf("New locale: %s\n", s);

        printf("Type any string ended by RETURN: ");

        while ((c = getchar()) != '\n')
                printf("%c: %s\n", c, isprint(c) ? "PRINTABLE" : "UNPRINTABLE");

        exit(0);
}
-------------------------------------
Then, set the LANG environment variable:

	LANG=es_ES.ISO_8859-1; export LANG
or	setenv LANG es_ES.ISO_8859-1

Next, run the program:

	jose@tiburon[~]$ ./a.out
	Old locale: C
	New locale: es_ES.ISO_8859-1
	Type any string ended by RETURN: ñÑéÉ¡¿aeiou
	ñ: UNPRINTABLE
	Ñ: UNPRINTABLE
	é: UNPRINTABLE
	É: UNPRINTABLE
	¡: UNPRINTABLE
	¿: UNPRINTABLE
	a: PRINTABLE
	e: PRINTABLE
	i: PRINTABLE
	o: PRINTABLE
	u: PRINTABLE

The result is obvious: isprint() does not recognise as printable
ISO-8859-1 characters which _are_ printable in that locale.
>Fix:
None.
>Audit-Trail:
>Unformatted:



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199712231511.HAA12601>