Beefy Boxes and Bandwidth Generously Provided by pair Networks
Syntactic Confectionery Delight
 
PerlMonks  

Re^4: text encodings and perl

by andal (Hermit)
on Nov 15, 2010 at 11:31 UTC ( [id://871447]=note: print w/replies, xml ) Need Help??


in reply to Re^3: text encodings and perl
in thread text encodings and perl

You seem to equate "is a text string" with "is_utf8 returns true". That's wrong.

No. I don't. I just said, that when "is_utf8" returns true, then perl thinks that it knows which is the encoding of text in the string. If the return value is "false", then perl does not know which encoding is really used, so it may use Latin1, or whatever is found working "most of the time". Of course, text string stays text string independent of is_utf8 flag. Just what perl can do with this string differs.

Just to illustrate it. Try to use in your examples russian letters written as UTF-8 strings and then apply "lc" to those strings. Ie.

$ perl -CS -Mstrict -wE 'say lc "\xd0\xa7"'
$ perl -CS -Mstrict -wE 'say "\xdo\xa7"'
This displays garbage instead of russian letter "Ч". Change it to
$ perl -CS -Mstrict -MEncode -wE 'say lc Encode::decode("UTF-8", "\xd0\xa7")'
$ perl -CS -Mstrict -MEncode -wE 'say Encode::decode("UTF-8", "\xdo\xa7")'
And you'll get the correct output. In fact, in your examples perl effectively calls the Encode::decode but with parameter "Latin1" instead of "UTF-8", that is why your letter (from Latin1) is displayed correctly, but mine (UTF-8) is not.

Replies are listed 'Best First'.
Re^5: text encodings and perl
by moritz (Cardinal) on Nov 15, 2010 at 11:52 UTC
    If the return value is "false", then perl does not know which encoding is really used, so it may use Latin1, or whatever is found working "most of the time"

    I'm curious how you came to that conclusion. For any text operation, perl has to assume an encoding. It uses UTF-8 if the utf8 flag is present on the string, and Latin 1 otherwise (assuming you didn't mess with locales). It has no notion of "working" and "most of the time".

    I'm well aware of when I need to decode, and when not. And my point was that deciding this question based on the return value of is_utf8 is wrong.

    In fact, in your examples perl effectively calls the Encode::decode but with parameter "Latin1" instead of "UTF-8"

    It doesn't. Because Latin-1 strings themselves can be perfectly fine text strings.

    If you don't believe me, add a warn to the Encode::decode() function of your local perl installation. You'll observe no such call.

      I'm curious how you came to that conclusion. For any text operation, perl has to assume an encoding. It uses UTF-8 if the utf8 flag is present on the string, and Latin 1 otherwise (assuming you didn't mess with locales). It has no notion of "working" and "most of the time".

      Looks like we are talking about completely different things. I can not find anywhere where my words contradict to yours. Yes, perl has to assume an encoding. I'm talking only about the fact that the developer shall make sure that the assumed encoding is correct. For this he/she shall use the Encode::decode methods, or the conveniences of perl like binmode or -CS switch or whatever.

      It doesn't. Because Latin-1 strings themselves can be perfectly fine text strings.

      Sorry, but do you understand the difference between words "effectively calls" and "really calls"? Of course perl does not call this function. It just assumes that the sequence of octets it has is encoded as Latin1. If it really is then everything works. But if it is not, then nothing works.

      I really don't understand where do you find in my words, that strings without utf8 flag are not text strings. They are. It's just that perl works with them as Latin1 strings, which is incorrect if your input is not Latin1. That's all. Nothing else.

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://871447]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others musing on the Monastery: (6)
As of 2024-04-16 06:55 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found