now $x consists of a single byte.
Yes, that's what I call a byte. So maybe it's my definition, not my term that's unclear.
which is defined in terms of substr, for which the UTF8 flag *does* matter
Ah, there's the problem. "The UTF8 flag doesn't matter" means different things to us. For a given string, substr will always return the same value regardless of the UTF8 flag, so I say the UTF8 doesn't matter to substr.
my $flag_is_0 = "\xC9ric"; utf8::downgrade($flag_is_0);
my $flag_is_1 = "\xC9ric"; utf8::upgrade($flag_is_1);
say substr($flag_is_0, 0, 1) eq substr($flag_is_1, 0, 1) ?1:0; # 1
I shall endeavor to find something clearer.
just do mind that not all people share your definition
Thus this post. If I refer them to this post, they can understand what I say even if their definitions are different.