http://www.perlmonks.org?node_id=11104867


in reply to Re^15: Text::CSV encoding parse()
in thread Text::CSV encoding parse()

I think I did, with haukex's script https://www.perlmonks.org/?node_id=11104578

and yes, Win 7

Replies are listed 'Best First'.
Re^17: Text::CSV encoding parse()
by hippo (Bishop) on Aug 23, 2019 at 13:26 UTC

    Here then is an SSCCE which works for me. It shows both the broken output which you should be seeing at the moment and the fixed output after it is properly encoded. I've taken the liberty of cleaning up some of your code and removing all the HTML-generating functions from CGI.pm as those are deprecated. In fact I've removed CGI.pm entirely since you weren't using it for anything else.

    #!/usr/bin/env perl use utf8; use strict; use Text::CSV; use Encode 'encode'; ### read the output my $resultsFile = "results.txt"; open my $fh, "<:encoding(utf8)", $resultsFile or die "cannot open re +sults file $resultsFile for reading: $!"; my @urls = grep {/\/search\//} <$fh>; close ($fh); print "Content-type: text/html; charset=utf-8\n\n"; print "<h2>Pre-sort</h1><ul>"; print "<li>$_</li>" for @urls; print "</ul>\n"; print "<h2>Same, but encoded</h2><ul>"; print encode ('UTF-8', "<li>$_</li>") for @urls; print "</ul>\n"; # sort @urls based on the search string my @sorted_urls = map { $_->[0] } sort { $a->[1] cmp $b->[1] } map { m|/search/\s*([^\?]+)\?|; [$_, $1] } @urls; my $csv = Text::CSV->new ({binary => 0, sep_char => "|"}); print "<h2>Broken sorted</h2>\n"; # parse and print print '<table>'; foreach my $row (@sorted_urls) { # print TEMP $row; $csv->parse ($row); my @els = $csv->fields; $els[0] =~ /\/search\/(.+)\?scope=/i; my ($term) = $1; my ($link) = $els[0]; print "<tr>"; print qq#<td><a href="$link" target="_blank">$term</a></td>#; print "<td>$_</td>\n" for @els[1 .. 4]; print "</tr>\n"; } print '</table>'; print "<h2>Same, but encoded</h2>"; # parse and print print '<table>'; foreach my $row (@sorted_urls) { # print TEMP $row; $csv->parse ($row); my @els = $csv->fields; $els[0] =~ /\/search\/(.+)\?scope=/i; my ($term) = $1; my ($link) = $els[0]; print "<tr>"; print encode ('UTF-8', qq#<td><a href="$link" target="_blank">$term</a></td>#); print "<td>$_</td>\n" for @els[1 .. 4]; print "</tr>\n"; } print '</table>';

    Hopefully you can see here that you just need to ensure that you properly encode the output. There are many ways to do this, I've picked one here which is very explicit, for your benefit. See Encode for lots more on how to use this module.

      Yes! That works! Thank you so much, very simple and easy to understand. I really appreciate your (and everyone else's) patience and generosity.