Paul Eggert wrote:
> > So, for me, (3) is the right approach: In the "C" locale, map 0x80..0xFF not
> > to U+0080..U+00FF but to U+DF80..U+DFFF, like musl libc does it. This will
> > ensure that c32isprint returns 0 on these inputs, like isprint does.
> 
> This sounds good to me as well. It is unfortunate that the "C" locale, which 
> is supposed to be fast, will have a small performance penalty on OpenBSD and 
> Cygwin (and I assume native MS-Windows?) due to Gnulib having to replace 
> mbrtoc32. But that's better than incorrect behavior.

Yes, I agree.

I used the program below to look at the behaviour of various platforms:

Result:

                       wchar_t world                           char32_t world

glibc                  mbrtowc failed                          OK
musl                   OK (...wc=0xDFFF)                       OK
macOS                  OK (...wc=0x00FF)                       OK
FreeBSD                OK (...wc=0x00FF)                       OK
NetBSD                 OK (...wc=0x00FF)                       OK
OpenBSD ≤ 7.3          OK (...wc=0x00FF)                       OK
OpenBSD                OK (...wc=0x00FF)                       FAIL
AIX 32-bit             OK (...wc=0x00FF)                       OK
AIX 64-bit             OK (...wc=0x00FF)                       OK
Solaris 11             OK (...wc=0x00FF)                       OK
Solaris OpenIndiana    OK (...wc=0x00FF)                       OK
Cygwin                 mbrtowc failed                          FAIL
mingw                  isprint=0 -- ...wc=0x00FF iswprint=1    FAIL
MSVC                   isprint=0 -- ...wc=0x00FF iswprint=1    FAIL
Android                mbrtowc failed                          OK ("C" is UTF-8)
Haiku                  mbrtowc failed                          OK

From this list, I infer that the correct condition
  - for the Cygwin, mingw, MSVC case is:
    _GL_SMALL_WCHAR_T && !GNULIB_defined_mbstate_t
  - for the OpenBSD case is:
    !MBRTOWC_IN_C_LOCALE_MAYBE_EILSEQ && HAVE_MBRTOC32 && !MUSL_LIBC

Implemented through the three attached patches.

Bruno

================================================================================
#include <locale.h>
#include <wchar.h>
#include <ctype.h>
#include <wctype.h>
#include <stdio.h>

int main ()
{
  int result;
  if (setlocale (LC_ALL, "C") == NULL)
    return 2;
  result = 0;
  {
    int i;
    for (i = 0xC0; i <= 0xFF; i++)
      {
        char c = i;
        wchar_t wc;
        mbstate_t mbs = { 0, };
        if (mbrtowc (&wc, &c, 1, &mbs) > 1)
          {
            printf ("mbrtowc failed for c=0x%02X\n", i);
            return 3;
          }
        int is1 = !!isprint ((unsigned char) c);
        int is2 = !!iswprint (wc);
        printf ("c=0x%02X isprint=%d -- wc=0x%04X iswprint=%d\n", i, is1, wc, 
is2);
        if (is1 != is2)
          result = 1;
      }
  }
  if (result == 0)
    printf ("OK\n");
  return result;
}
================================================================================
From d05f95bec14dcd5d58aef358a520f15ec64c381b Mon Sep 17 00:00:00 2001
From: Bruno Haible <[email protected]>
Date: Thu, 27 Aug 2026 23:53:07 +0200
Subject: [PATCH 1/3] mbrtoc32: Make c32isprint compatible with isprint in the
 C locale.

Reported by Paul Eggert in
<https://lists.gnu.org/archive/html/bug-gnulib/2026-08/msg00222.html>.

* lib/mbrtoc32.c (mbrtoc32)
[!GNULIB_defined_mbstate_t && _GL_SMALL_WCHAR_T]: On Cygwin and native
Windows, in the C locale, map 0x80..0xFF differently.
* lib/btoc32.c: Include hard-locale.h.
(btoc32): [!GNULIB_defined_mbstate_t && _GL_SMALL_WCHAR_T]: On Cygwin
and native Windows, in the C locale, map 0x80..0xFF differently.
* modules/btoc32 (Depends-on): Add hard-locale.
---
 ChangeLog      | 15 ++++++++++++++-
 lib/btoc32.c   | 17 +++++++++++++++++
 lib/mbrtoc32.c | 14 ++++++++++++--
 modules/btoc32 |  1 +
 4 files changed, 44 insertions(+), 3 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index a02b8878b4..53aa25ecb2 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,16 @@
+2026-08-27  Bruno Haible  <[email protected]>
+
+	mbrtoc32: Make c32isprint compatible with isprint in the C locale.
+	Reported by Paul Eggert in
+	<https://lists.gnu.org/archive/html/bug-gnulib/2026-08/msg00222.html>.
+	* lib/mbrtoc32.c (mbrtoc32)
+	[!GNULIB_defined_mbstate_t && _GL_SMALL_WCHAR_T]: On Cygwin and native
+	Windows, in the C locale, map 0x80..0xFF differently.
+	* lib/btoc32.c: Include hard-locale.h.
+	(btoc32): [!GNULIB_defined_mbstate_t && _GL_SMALL_WCHAR_T]: On Cygwin
+	and native Windows, in the C locale, map 0x80..0xFF differently.
+	* modules/btoc32 (Depends-on): Add hard-locale.
+
 2026-08-27  Bruno Haible  <[email protected]>
 
 	getlogin: Fix link error with option --with-systemd (regr. 2025-03-09).
@@ -1862,7 +1875,7 @@
 	go back to the old way of doing things, without the recently-added
 	USE_C_LOCALE stuff.  Then make the following changes instead:
 	* lib/quotearg.c [_QUOTEARG_AVOID_UCHAR_H]: Don’t include <uchar.h>.
-	(mbrto2c, mbstate_t) [_QUOTEARG_AVOID_UCHAR_H && defined __UCLIBC__
+	(mbrtowc, mbstate_t) [_QUOTEARG_AVOID_UCHAR_H && defined __UCLIBC__
 	&& !defined __UCLIBC_HAS_WCHAR__]: New macros.
 	Also, don’t include <wchar.h> or <wctype.h>.
 	(char32_t, c32isprint, mbrtoc32, GNULIB_MBRTOC32_REGULAR)
diff --git a/lib/btoc32.c b/lib/btoc32.c
index e4ca972db0..9af58b2582 100644
--- a/lib/btoc32.c
+++ b/lib/btoc32.c
@@ -26,6 +26,11 @@
 #include <string.h>
 #include <wchar.h>
 
+#if !GNULIB_defined_mbstate_t && _GL_SMALL_WCHAR_T
+# include "hard-locale.h"
+# include <locale.h>
+#endif
+
 #if GL_CHAR32_T_IS_UNICODE
 # include "lc-charset-unicode.h"
 #endif
@@ -51,6 +56,18 @@ btoc32 (int c)
     }
   return WEOF;
 #else
+# if !GNULIB_defined_mbstate_t && _GL_SMALL_WCHAR_T /* Cygwin, mingw, MSVC */
+  if (!hard_locale (LC_CTYPE))
+    {
+      /* In the "C" locale, map the bytes 0x80..0xFF to U+DF80..U+DFFF, so that
+         the c32is* functions return false on them, for consistency with the
+         <ctype.h> is* functions.  */
+      if (c != EOF)
+        return (c < 0x80 ? c : 0xDF00 + c);
+      else
+        return WEOF;
+    }
+# endif
   /* In all known locale encodings, unibyte characters correspond only to
      characters in the BMP.  */
   wint_t wc = btowc (c);
diff --git a/lib/mbrtoc32.c b/lib/mbrtoc32.c
index 5f89e05460..ff4799ded1 100644
--- a/lib/mbrtoc32.c
+++ b/lib/mbrtoc32.c
@@ -92,7 +92,7 @@ mbrtoc32 (char32_t *pwc, const char *s, size_t n, mbstate_t *ps)
 # include "localcharset.h"
 # include "streq-opt.h"
 
-# if MBRTOC32_IN_C_LOCALE_MAYBE_EILSEQ
+# if MBRTOC32_IN_C_LOCALE_MAYBE_EILSEQ || _GL_SMALL_WCHAR_T
 #  include "hard-locale.h"
 #  include <locale.h>
 # endif
@@ -291,7 +291,7 @@ mbrtoc32 (char32_t *pwc, const char *s, size_t n, mbstate_t *ps)
 
   return ret;
 
-# elif _GL_SMALL_WCHAR_T
+# elif _GL_SMALL_WCHAR_T /* Cygwin, mingw, MSVC */
 
   /* Special-case all encodings that may produce wide character values
      > WCHAR_MAX.  */
@@ -386,6 +386,16 @@ mbrtoc32 (char32_t *pwc, const char *s, size_t n, mbstate_t *ps)
       /* The conversion state is undefined, says POSIX.  */
       return (size_t)(-1);
     }
+  else if (!hard_locale (LC_CTYPE))
+    {
+      /* In the "C" locale, map the bytes 0x80..0xFF to U+DF80..U+DFFF, so that
+         the c32is* functions return false on them, for consistency with the
+         <ctype.h> is* functions.  */
+      unsigned char c = (unsigned char) s[0];
+      if (pwc != NULL)
+        *pwc = (c < 0x80 ? c : 0xDF00 + c);
+      return (c == 0 ? 0 : 1);
+    }
   else
     {
       wchar_t wc;
diff --git a/modules/btoc32 b/modules/btoc32
index e2acebb402..d3e13be578 100644
--- a/modules/btoc32
+++ b/modules/btoc32
@@ -8,6 +8,7 @@ Depends-on:
 uchar-h
 mbszero
 mbrtoc32
+hard-locale
 btowc
 
 configure.ac:
-- 
2.53.0

>From 27353a8efc89559b855c9688a8c32183418267b7 Mon Sep 17 00:00:00 2001
From: Bruno Haible <[email protected]>
Date: Fri, 28 Aug 2026 00:41:53 +0200
Subject: [PATCH 2/3] mbrtoc32: Make c32isprint compatible with isprint in the
 C locale.

Reported by Paul Eggert in
<https://lists.gnu.org/archive/html/bug-gnulib/2026-08/msg00222.html>.

* m4/mbrtoc32.m4 (gl_MBRTOC32_C_LOCALE_LIKE_ISO_8859): New macro.
(gl_FUNC_MBRTOC32): Define MBRTOC32_IN_C_LOCALE_MAYBE_LIKE_ISO_8859 and
set REPLACE_MBRTOC32 on platforms such as OpenBSD.
* lib/mbrtoc32.c (mbrtoc32) [MBRTOC32_IN_C_LOCALE_MAYBE_LIKE_ISO_8859]:
In the C locale, map 0x80..0xFF differently.
* lib/btoc32.c (btoc32) [MBRTOC32_IN_C_LOCALE_MAYBE_LIKE_ISO_8859]:
Likewise.
* doc/posix-functions/mbrtoc32.texi: Mention the OpenBSD problem.
---
 ChangeLog                         | 12 +++++++
 doc/posix-functions/mbrtoc32.texi |  5 +++
 lib/btoc32.c                      | 28 ++++++++--------
 lib/mbrtoc32.c                    | 23 +++++++++++--
 m4/mbrtoc32.m4                    | 55 +++++++++++++++++++++++++++++--
 5 files changed, 105 insertions(+), 18 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 53aa25ecb2..b829acc302 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,17 @@
 2026-08-27  Bruno Haible  <[email protected]>
 
+	mbrtoc32: Make c32isprint compatible with isprint in the C locale.
+	Reported by Paul Eggert in
+	<https://lists.gnu.org/archive/html/bug-gnulib/2026-08/msg00222.html>.
+	* m4/mbrtoc32.m4 (gl_MBRTOC32_C_LOCALE_LIKE_ISO_8859): New macro.
+	(gl_FUNC_MBRTOC32): Define MBRTOC32_IN_C_LOCALE_MAYBE_LIKE_ISO_8859 and
+	set REPLACE_MBRTOC32 on platforms such as OpenBSD.
+	* lib/mbrtoc32.c (mbrtoc32) [MBRTOC32_IN_C_LOCALE_MAYBE_LIKE_ISO_8859]:
+	In the C locale, map 0x80..0xFF differently.
+	* lib/btoc32.c (btoc32) [MBRTOC32_IN_C_LOCALE_MAYBE_LIKE_ISO_8859]:
+	Likewise.
+	* doc/posix-functions/mbrtoc32.texi: Mention the OpenBSD problem.
+
 	mbrtoc32: Make c32isprint compatible with isprint in the C locale.
 	Reported by Paul Eggert in
 	<https://lists.gnu.org/archive/html/bug-gnulib/2026-08/msg00222.html>.
diff --git a/doc/posix-functions/mbrtoc32.texi b/doc/posix-functions/mbrtoc32.texi
index 629a75dec4..72a373b3e6 100644
--- a/doc/posix-functions/mbrtoc32.texi
+++ b/doc/posix-functions/mbrtoc32.texi
@@ -22,6 +22,11 @@
 @c https://sourceware.org/PR29511
 glibc 2.35.
 @item
+In the C or POSIX locales,
+this function returns values like in ISO-8859-1 locales,
+which leads to @code{c32isprint} etc.@: being inconsistent with @code{isprint}:
+OpenBSD 7.9.
+@item
 This function returns 0 instead of @code{(size_t) -2} when the input
 is empty:
 @c https://sourceware.org/PR16950
diff --git a/lib/btoc32.c b/lib/btoc32.c
index 9af58b2582..31b3890723 100644
--- a/lib/btoc32.c
+++ b/lib/btoc32.c
@@ -26,7 +26,8 @@
 #include <string.h>
 #include <wchar.h>
 
-#if !GNULIB_defined_mbstate_t && _GL_SMALL_WCHAR_T
+#if MBRTOC32_IN_C_LOCALE_MAYBE_LIKE_ISO_8859 \
+    || (!GNULIB_defined_mbstate_t && _GL_SMALL_WCHAR_T)
 # include "hard-locale.h"
 # include <locale.h>
 #endif
@@ -41,6 +42,19 @@ _GL_EXTERN_INLINE
 wint_t
 btoc32 (int c)
 {
+#if MBRTOC32_IN_C_LOCALE_MAYBE_LIKE_ISO_8859 /* OpenBSD */ \
+    || (!GNULIB_defined_mbstate_t && _GL_SMALL_WCHAR_T) /* Cygwin, mingw, MSVC */
+  if (!hard_locale (LC_CTYPE))
+    {
+      /* In the "C" locale, map the bytes 0x80..0xFF to U+DF80..U+DFFF, so that
+         the c32is* functions return false on them, for consistency with the
+         <ctype.h> is* functions.  */
+      if (c != EOF)
+        return (c < 0x80 ? c : 0xDF00 + c);
+      else
+        return WEOF;
+    }
+#endif
 #if HAVE_WORKING_MBRTOC32 && HAVE_WORKING_C32RTOMB && !_GL_WCHAR_T_IS_UCS4
   /* The char32_t encoding of a multibyte character may be different than its
      wchar_t encoding.  */
@@ -56,18 +70,6 @@ btoc32 (int c)
     }
   return WEOF;
 #else
-# if !GNULIB_defined_mbstate_t && _GL_SMALL_WCHAR_T /* Cygwin, mingw, MSVC */
-  if (!hard_locale (LC_CTYPE))
-    {
-      /* In the "C" locale, map the bytes 0x80..0xFF to U+DF80..U+DFFF, so that
-         the c32is* functions return false on them, for consistency with the
-         <ctype.h> is* functions.  */
-      if (c != EOF)
-        return (c < 0x80 ? c : 0xDF00 + c);
-      else
-        return WEOF;
-    }
-# endif
   /* In all known locale encodings, unibyte characters correspond only to
      characters in the BMP.  */
   wint_t wc = btowc (c);
diff --git a/lib/mbrtoc32.c b/lib/mbrtoc32.c
index ff4799ded1..826f367708 100644
--- a/lib/mbrtoc32.c
+++ b/lib/mbrtoc32.c
@@ -92,7 +92,9 @@ mbrtoc32 (char32_t *pwc, const char *s, size_t n, mbstate_t *ps)
 # include "localcharset.h"
 # include "streq-opt.h"
 
-# if MBRTOC32_IN_C_LOCALE_MAYBE_EILSEQ || _GL_SMALL_WCHAR_T
+# if (MBRTOC32_IN_C_LOCALE_MAYBE_LIKE_ISO_8859 \
+      || MBRTOC32_IN_C_LOCALE_MAYBE_EILSEQ \
+      || _GL_SMALL_WCHAR_T)
 #  include "hard-locale.h"
 #  include <locale.h>
 # endif
@@ -134,8 +136,10 @@ mbrtoc32 (char32_t *pwc, const char *s, size_t n, mbstate_t *ps)
       n = 1;
     }
 
-# if (MBRTOC32_EMPTY_INPUT_BUG || _GL_SMALL_WCHAR_T \
-      || (GNULIB_WCHAR_SINGLE_LOCALE && __GLIBC__ >= 2 && !__UCLIBC__))
+# if (MBRTOC32_EMPTY_INPUT_BUG \
+      || (GNULIB_WCHAR_SINGLE_LOCALE && __GLIBC__ >= 2 && !__UCLIBC__) \
+      || MBRTOC32_IN_C_LOCALE_MAYBE_LIKE_ISO_8859 \
+      || _GL_SMALL_WCHAR_T)
   if (n == 0)
     return (size_t) -2;
 # endif
@@ -262,6 +266,19 @@ mbrtoc32 (char32_t *pwc, const char *s, size_t n, mbstate_t *ps)
   /* mbrtoc32() may produce different values for wc than mbrtowc().  Therefore
      use mbrtoc32().  */
 
+#  if MBRTOC32_IN_C_LOCALE_MAYBE_LIKE_ISO_8859 /* OpenBSD */
+  if (!hard_locale (LC_CTYPE))
+    {
+      /* In the "C" locale, map the bytes 0x80..0xFF to U+DF80..U+DFFF, so that
+         the c32is* functions return false on them, for consistency with the
+         <ctype.h> is* functions.  */
+      unsigned char c = (unsigned char) s[0];
+      if (pwc != NULL)
+        *pwc = (c < 0x80 ? c : 0xDF00 + c);
+      return (c == 0 ? 0 : 1);
+    }
+#  endif
+
 #  if defined _WIN32 && !defined __CYGWIN__
   char32_t wc;
   size_t ret = mbrtoc32 (&wc, s, n, ps);
diff --git a/m4/mbrtoc32.m4 b/m4/mbrtoc32.m4
index 9eb9a7e223..2631695713 100644
--- a/m4/mbrtoc32.m4
+++ b/m4/mbrtoc32.m4
@@ -1,5 +1,5 @@
 # mbrtoc32.m4
-# serial 25
+# serial 26
 dnl Copyright (C) 2014-2026 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
@@ -9,6 +9,7 @@
 AC_DEFUN([gl_FUNC_MBRTOC32],
 [
   AC_REQUIRE([gl_UCHAR_H_DEFAULTS])
+  AC_REQUIRE([AC_CANONICAL_HOST])
 
   AC_REQUIRE([AC_TYPE_MBSTATE_T])
   dnl Determine REPLACE_MBSTATE_T, from which GNULIB_defined_mbstate_t is
@@ -28,6 +29,7 @@ AC_DEFUN([gl_FUNC_MBRTOC32]
     else
       gl_MBRTOC32_EMPTY_INPUT
       gl_MBRTOC32_C_LOCALE
+      gl_MBRTOC32_C_LOCALE_LIKE_ISO_8859
       gl_MBRTOC32_UTF8_LOCALE
       case "$gl_cv_func_mbrtoc32_empty_input" in
         *yes) ;;
@@ -43,6 +45,17 @@ AC_DEFUN([gl_FUNC_MBRTOC32]
            REPLACE_MBRTOC32=1
            ;;
       esac
+      case "$gl_cv_func_mbrtoc32_C_locale_sans_EILSEQ" in
+        *yes)
+          case "$gl_cv_func_mbrtoc32_C_locale_like_iso_8859" in
+            *yes)
+              AC_DEFINE([MBRTOC32_IN_C_LOCALE_MAYBE_LIKE_ISO_8859], [1],
+                [Define if the mbrtoc32 function in the C locale may work like in an ISO-8859-1 locale.])
+              REPLACE_MBRTOC32=1
+              ;;
+          esac
+          ;;
+      esac
       case "$gl_cv_func_mbrtoc32_utf8_locale_works" in
         *yes) ;;
         *) AC_DEFINE([MBRTOC32_MULTIBYTE_LOCALE_BUG], [1],
@@ -167,7 +180,7 @@ AC_DEFUN([gl_MBRTOC32_EMPTY_INPUT]
 AC_DEFUN([gl_MBRTOC32_C_LOCALE],
 [
   AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
-  AC_CACHE_CHECK([whether the C locale is free of encoding errors],
+  AC_CACHE_CHECK([whether mbrtoc32 in the C locale is free of encoding errors],
     [gl_cv_func_mbrtoc32_C_locale_sans_EILSEQ],
     [AC_RUN_IFELSE(
        [AC_LANG_PROGRAM(
@@ -204,6 +217,44 @@ AC_DEFUN([gl_MBRTOC32_C_LOCALE]
     ])
 ])
 
+dnl Test whether mbrtoc32 in the C locale works like in an ISO-8859-1 locale.
+
+AC_DEFUN([gl_MBRTOC32_C_LOCALE_LIKE_ISO_8859],
+[
+  AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+  AC_CACHE_CHECK([whether mbrtoc32 in the C locale works like in an ISO-8859-1 locale],
+    [gl_cv_func_mbrtoc32_C_locale_like_iso_8859],
+    [AC_RUN_IFELSE(
+       [AC_LANG_PROGRAM(
+          [[#include <limits.h>
+            #include <locale.h>
+            #ifdef __HAIKU__
+             #include <stdint.h>
+            #endif
+            #include <uchar.h>
+          ]], [[
+            int i;
+            const char *locale = setlocale (LC_ALL, "C");
+            if (! locale)
+              return 2;
+            char c = 0xE0;
+            char32_t wc;
+            mbstate_t mbs = { 0, };
+            size_t ss = mbrtoc32 (&wc, &c, 1, &mbs);
+            if (ss == 1 && wc == 0x00E0)
+              return 3;
+            return 0;
+          ]])],
+       [gl_cv_func_mbrtoc32_C_locale_like_iso_8859=no],
+       [gl_cv_func_mbrtoc32_C_locale_like_iso_8859=yes],
+       [case "$host_os" in
+          *-musl* | midipix*) gl_cv_func_mbrtoc32_C_locale_like_iso_8859="no" ;;
+          *)                  gl_cv_func_mbrtoc32_C_locale_like_iso_8859="possibly yes" ;;
+        esac
+       ])
+    ])
+])
+
 dnl Test whether mbrtoc32 works when it's fed the bytes one-by-one in an UTF-8
 dnl locale.
 
-- 
2.53.0

From de054f5dc8906dbac0054e113d7d4fd0430a3398 Mon Sep 17 00:00:00 2001
From: Bruno Haible <[email protected]>
Date: Fri, 28 Aug 2026 00:43:56 +0200
Subject: [PATCH 3/3] tests: Check that c32isprint is consistent with isprint
 in the C locale.

* tests/test-c32isprint.c: Include <ctype.h>.
(main): In the C locale, check that c32isprint is consistent with
isprint.
---
 ChangeLog               |  5 +++++
 tests/test-c32isprint.c | 15 +++++++++++++++
 2 files changed, 20 insertions(+)

diff --git a/ChangeLog b/ChangeLog
index b829acc302..2254b198b1 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,10 @@
 2026-08-27  Bruno Haible  <[email protected]>
 
+	tests: Check that c32isprint is consistent with isprint in the C locale.
+	* tests/test-c32isprint.c: Include <ctype.h>.
+	(main): In the C locale, check that c32isprint is consistent with
+	isprint.
+
 	mbrtoc32: Make c32isprint compatible with isprint in the C locale.
 	Reported by Paul Eggert in
 	<https://lists.gnu.org/archive/html/bug-gnulib/2026-08/msg00222.html>.
diff --git a/tests/test-c32isprint.c b/tests/test-c32isprint.c
index 9d91ef3640..42a5092d4f 100644
--- a/tests/test-c32isprint.c
+++ b/tests/test-c32isprint.c
@@ -21,6 +21,7 @@
 #include "signature.h"
 SIGNATURE_CHECK (c32isprint, int, (wint_t));
 
+#include <ctype.h>
 #include <locale.h>
 #include <stdlib.h>
 #include <string.h>
@@ -106,6 +107,20 @@ main (int argc, char *argv[])
       {
       case '0':
         /* C locale; tested above.  */
+#if !defined __ANDROID__
+        /* On Android ≥ 5.0, the default locale is the "C.UTF-8" locale, not the
+           "C" locale.  Furthermore, when you attempt to set the "C" or "POSIX"
+           locale via setlocale(), what you get is a "C" locale with UTF-8
+           encoding, that is, effectively the "C.UTF-8" locale.  */
+        /* Check that c32isprint is consistent with isprint.  */
+        for (int c = 0x80; c < 0x100; c++)
+          {
+            ASSERT (!isprint ((unsigned char) c));
+            buf[0] = (unsigned char) c;
+            is = for_character (buf, 1);
+            ASSERT (is == 0);
+          }
+#endif
         return test_exit_status;
 
       case '1':
-- 
2.53.0

Reply via email to