<div dir="ltr"><div class="gmail_quote">On Mon, Feb 13, 2012 at 1:12 PM, Issac Goldstand <span dir="ltr">&lt;<a href="mailto:margol@beamartyr.net">margol@beamartyr.net</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

  
    
  
  <div bgcolor="#FFFFFF" text="#000000"><div class="im">
    On 13/02/2012 12:54, Gaal Yahas wrote:
    <blockquote type="cite">
      <div dir="ltr"><br>
        <div class="gmail_quote">On Mon, Feb 13, 2012 at 12:30 PM, Issac
          Goldstand <span dir="ltr">&lt;<a href="mailto:margol@beamartyr.net" target="_blank">margol@beamartyr.net</a>&gt;</span>
          wrote:<br>
          <blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
            If there&#39;s one thing I can never seem to get straight, it&#39;s
            character<br>
            encodings...<br>
            <br>
            I&#39;m trying to parse some data from the web which can come in
            different<br>
            encodings, and write unit tests which come from static
            files.<br>
            <br>
            One of the strings that I&#39;m trying to test for is &quot;Forex
            Trading Avec<br>
            100€&quot;  The string is originally encoded (supposedly) in
            ISO-8859-1 based<br>
            on the header Content-Type: text/html; charset=ISO-8859-1
            and presence<br>
            of the following META tag &lt;meta http-equiv=&quot;Content-Type&quot;<br>
            content=&quot;text/html; charset=ISO-8859-1&quot;&gt;<br>
            <br>
          </blockquote>
          <div><br>
          </div>
          When dealing with encoding problems, it&#39;s helpful to isolate
          the problem as much as you can. Every piece that reports on an
          encoding can get it wrong, and the fact that both the server
          and the document claim it&#39;s 8859-1 doesn&#39;t mean it they aren&#39;t
          lying. So start by fetching the document in raw form with curl
          or wget, and open that with &quot;od -t x1a&quot;.<br>
        </div>
      </div>
    </blockquote></div>
    That gave me HEX format, which I don&#39;t understand how it&#39;d really
    help (unless I got lucky and found a BOM at the start)...</div></blockquote><div><br></div><div>The hex dump gives you the truth about the data on the wire. There&#39;s some abstract stream of text which somebody encoded in some way, with is probably cp-1252, and labeled it another way, iso8859-1. Then the web server was either configured to use 8859-1 or trusted the meta tag, or something, and sent that over to the client with the wrong label again in the HTTP header.</div>
<div><br></div><div>You shouldn&#39;t expect to see a BOM here because that&#39;s a feature of Unicode, and neither cp-1252 nor iso 8859-1 are Unicode encodings. They&#39;re 8 bit encodings, not self-documenting, and notorious for exactly this kind of trouble.</div>
<div><br></div><div>cp-1252 encodes the Euro symbol as the byte 0x80. In Unicode, the code point is U+20A0, which encodes as 0xE2 0x82 0xAC in UTF-8, or 0x20 0xA0 / 0xA0 0x20 in UTF-16 depending on endianity. Looking at the hex dump allows you to find the specific character and see how it was encoded, then infer what the document &quot;really&quot; is. You have the benefit here of knowing what symbol you&#39;re expecting.</div>
<div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div bgcolor="#FFFFFF" text="#000000"><div class="im"><br>
    <blockquote type="cite">
      <div dir="ltr">
        <div class="gmail_quote">
          <div> </div>
          <blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
            (N.B. I&#39;m a bit confused by that as IIRC, ISO-8859-1 doesn&#39;t
            contain the<br>
            EUR character...)<br>
            <br>
          </blockquote>
          <div><br>
          </div>
          <div>The standard predates the currency.</div>
        </div>
      </div>
    </blockquote></div>
    I know - I meant it seemed odd that the document could *be*
    ISO-8859-1 given that fact.<div class="im"><br></div></div></blockquote><div><br></div><div>Well, obviously it *isn&#39;t*. It&#39;s just labeled that way :-)  </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div bgcolor="#FFFFFF" text="#000000"><div class="im">
    <blockquote type="cite">
      <div dir="ltr">
        <div class="gmail_quote">
          <div> </div>
          <blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
            When opening the source code in a text editor as either
            ISO-8859-1 or<br>
            ISO-8859-15 (or even UTF-8), I can&#39;t see the character.  I
            *do* see the<br>
            character when viewing it as CP1255 which kinda worries me,
            as I get the<br>
            feeling I&#39;m a lot farther from the source as I think when I
            see that...<br>
            <br>
          </blockquote>
          <div><br>
          </div>
          <div>Sounds like you actually have the problem in your hands:
            somebody misencoded the data.</div>
          <div> </div>
          <blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
            My unit test for above test is as following:<br>
            <br>
            use utf8; # String literals contain UTF-8 in this file<br>
            binmode STDOUT &quot;:utf8&quot;;<br>
            ...<br>
            open($fh, &quot;&lt;:encoding(ISO-8859-1)&quot;, &quot;t/html0004.html&quot;) ||
            die &quot;...: $!&quot;;<br>
            $parser-&gt;parse_file($fh); # Subclassed HTML::Parser<br>
            ...<br>
            is($test-&gt;{top}, &quot;Forex Trading Avec 100€&quot;, &quot;Correct
            headline text&quot;);<br>
          </blockquote>
          <div><br>
          </div>
          <div>If you tweak your code to use cp1255 (which encodes Euro
            as 0x80), does it pass? I expect it should, confirming the
            problem. </div>
          <blockquote class="gmail_quote" style="margin:0pt 0pt 0pt 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
            <br>
          </blockquote>
        </div>
      </div>
    </blockquote></div>
    It failed some other tests adding hebrew chars instead of accents. 
    CP1252 seemed to work, but this bothers me as I&#39;m still doing human
    guess-work, and this would (and, indeed, does) still cause problems
    in the production code which has only LWP&#39;s output to work with. 
    And LWP goes by the character codes presented by the document from
    what I can see:<br>
    <br>
    (Message.pm line 359 from HTTP::Message)<br>
        if ($self-&gt;content_is_text || (my $is_xml =
    $self-&gt;content_is_xml)) {<br>
            my $charset = lc(<br>
                $opt{charset} ||<br>
            $self-&gt;content_type_charset ||<br>
            $opt{default_charset} ||<br>
            $self-&gt;content_charset ||<br>
            &quot;ISO-8859-1&quot;<br>
            );<br>
    <br>
    Do you know a better way to guess the real content-type?  The
    browsers do it somehow...<br></div></blockquote><div><br></div><div><div>If you&#39;re dealing with 8-bit encodings, you&#39;ll have to use some sort of probabilistic method, unless you have some special knowledge about your documents.</div>
<div><br></div><div>&quot;Of course, this is a heuristic, which is a fancy way of saying that it doesn&#39;t work.&quot; --<a href="http://www.perl.com/pub/2000/02/spamfilter.html">mjd</a></div></div><div> </div><div><br>
</div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div bgcolor="#FFFFFF" text="#000000">
  </div>

<br>_______________________________________________<br>
Perl mailing list<br>
<a href="mailto:Perl@perl.org.il">Perl@perl.org.il</a><br>
<a href="http://mail.perl.org.il/mailman/listinfo/perl" target="_blank">http://mail.perl.org.il/mailman/listinfo/perl</a><br></blockquote></div><br><br clear="all"><div><br></div>-- <br>Gaal Yahas &lt;<a href="mailto:gaal@forum2.org">gaal@forum2.org</a>&gt;<br>
<a href="http://gaal.livejournal.com/">http://gaal.livejournal.com/</a><br>
</div>