Re: Make Encode.pm support the real UTF-8

[email protected] (Gisle Aas)
Newsgroups perl.unicode
Message-ID <[email protected]>
Bjoern Hoehrmann <[email protected]> writes:

> * Gisle Aas wrote:
> >As you probably know perl's version of UTF-8 is not the real thing.  I
> >thought I would hack up a patch to support the encoding as defined by
> >Unicode.  That involves rejecting illegal chars (like surrogates,
> >"\x{FFFF}" and "\x{FDD0}), chars above 0x10FFFF, overlong sequences
> >and such.
> 
> I would very much like to have this functionality available in some
> standard module. Though, what do you mean here by rejecting exactly?

It would do the same as it currently does for illegal UTF-8-Perl.  It
falls back to what the CHECK argument ask for.

> For example, by default, I would expect
> 
>   decode("UTF-8" => "Bj\xF6rn")
> 
> to return "Bj\x{FFFD}rn" as documented in `perldoc Encode`; would
> this change (i.e., would it croak instead)?

It would be exactly the same.

More interesting is:

   decode("UTF8", "Bj\xEF\xBF\xBFrn")

where "\xEF\xBF\xBF" is not legal UTF-8 because "\x{FFFF}" is not
legal Unicode.  Either the whole sequence "\xEF\xBF\xBF" is replaced
by "\x{FFFD}" or each bad byte is giving us
"Bj\x{FFFD}\x{FFFD}\x{FFFD}rn".  I think the later will be more sane,
especially when you hit on perl 64-bit extension to UTF-8..

> >Before I do this I would like to get some feedback on the interface.
> >My prefered interface would be to make:
> >
> >   encode("UTF-8", $string)
> >
> >imply the official restricted form and then have
> >
> >   encode("UTF-8-Perl", $string)
> >
> >be used as the name for Perl's relaxed and extended version of the
> >encoding.  The encode_utf8($string) function would continue to be the
> >same as encode("UTF-8-Perl", $string).
> 
> I would prefer there was no semantic overloading of "UTF-8" at all,
> I generally expect that anything called UTF-8 refers to UTF-8 as
> defined in the Unicode standard or RFC 3629. I was for example sur-
> prised that Encode::is_utf8(...) considers sequences UTF-8 that are
> not UTF-8 as defined in those specifications (the documentation
> explicitly states "well-formed UTF-8").

This can be fixed by fixing the documentation.  It might be possible
to get a way by making a distinction between 'utf8' and 'UTF-8'.  The
former being the perl variant while we reserve uppercase form with
dash for the real UTF-8.

> Now that we have this problem, introducing more places where one needs
> to carefully check the documentation what is considered UTF-8 does not
> seem like the best option, having decode_utf8() and decode(utf8=>...)
> mean some- thing different is likely going to cause confusion. Maybe
> this could go the other way round, i.e. introduce a new encoding
> "UTF-8-Strict" or something.

This is certainly more backwards compatible, but do we really want
perl applications to exchange illegal UTF-8 by default?

> >This implies that encode("UTF-8", $string) can start failing while
> >previously it could not.
> 
> As above, by default I do not think it should fail but rather use a
> replacement character instead of croaking.

Yes.  By failing I mean; handle the bad bytes as specified by the
CHECK argument.

>                                              The result should be the
> same as (using RFC-3629-UTF-8 to mean the non-Perl UTF-8)
> 
>   encode("RFC-3629-UTF-8" => decode("RFC-3629-UTF-8" => $string))
> 
> where decode("RFC-3629-UTF-8") would always return a RFC-3629-UTF-8
> string with no illegal sequences (and as that should not fail, the
> above should not fail either). I.e.
> 
>   encode("RFC-3629-UTF-8" => $string) eq
>   encode("RFC-3629-UTF-8" => decode("RFC-3629-UTF-8" => $string))
> 
> would always hold true (assuming that decode("RFC-3629-UTF-8") would
> ignore that the UTF-8 flag on $string is already set and decode
> "again").
> 
> >Other suggestions or comments?
> 
> There should be a corresponding is_foo function that checks whether
> a sequence of octets (or a string with the UTF-8 flag set) is actually
> UTF-8 as defined in the relevant specifications, maybe by adding one
> more argument to Encode::is_utf8 like
> 
>   Encode::is_utf8($string, $perl_utf8_check, $real_utf8_check)

Agree.

Regards,
Gisle
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.