On Friday, 8 April 2022 at 08:36:33 UTC, Ali Çehreli wrote:
On 4/7/22 23:13, anonymous wrote:
> What's the proper way to output all characters in the
extended character
> set?

It is not easy to answer because there are a number of concepts here that may make it trivial or complicated.

The configuration of the output device matters. Is it set to Windows-1252 or are you using Unicode strings in Python?

I'm running Ubuntu and my default language is en_US.UTF-8.

>
> ```d
> void main()
> {
>      foreach(char c; 0 .. 256)

'char' is wrong there because 'char' has a very special meaning in D: A UTF-8 code unit. Not a full Unicode character in many cases, especially in the "extended" set.

I think your problem will be solved simply by replacing 'char' with 'dchar' there:

  foreach (dchar c; ...

I tried that. It didn't work.

However, isControl() below won't work because isControl() only knows about the ASCII table. It would miss the unprintable characters above 127.

>      {
>         write(isControl(c) ? '.' : c);
>      }
> }
> ```

Oh okay, that may have been the reason.

This works:

import std.stdio;

bool isPrintableLatin1(dchar value) {
  if (value < 32) {
    return false;
  }

  if (value > 126 && value < 161) {
    return false;
  }

  return true;
}

void main() {
  foreach (dchar c; 0 .. 256) {
    write(isPrintableLatin1(c) ? c : '.');
  }

Nope... running this code, I get a bunch of digits as the output. The dot's don't even show up. Maybe I'm drunk or lacking sleep.

Weird, I got this strange feeling that this problem stemmed from the compiler I'm using (GDC) so I installed DMD. Would you believe everything worked fine afterwords? To include the original version where I used isControl and 'dchar' instead of 'char'. I wonder why that is?

Thanks Ali.

Reply via email to