On Sat, Feb 22, 2020 at 10:21:56PM +0000, Stuart Henderson wrote:
> On 2020/02/22 17:24, Stefan Sperling wrote:
> > On Sat, Feb 22, 2020 at 02:56:54PM +0100, Mark Kettenis wrote:
> > > IMHO it is a bad idea to make the output of ifconfig locale-dependent.
> >
> > Fine. I'll drop this diff.
> >
>
> Pity, it is quite useful if you are somewhere that uses UTF-8 SSIDs,
> otherwise it's a complete pain to decode to figure out if you're
> connecting to the correct network. An alternative would be to filter
> ifconfig output through something like this
>
> while(<>) {
>         if ($_ =~ m/nwid 0x([0-9a-f]+)\s/) {
>                 my $hex = $1;
>                 my $decoded = pack "H*", $hex;
>                 $_ =~ s/$hex/$hex ("$decoded")/;
>         }
>         print $_;
> }
>
> but it won't validate the characters so best redirect output to a file
> and open it in a UTF-8 editor to view it rather than displaying it
> directly on a terminal.

This removes any characters that are not marked as "printable", which I
expect is what folks want.  Still doesn't always help since I still
haven't figured out font fallback in xterm so some chars don't exist in
my current font.

ifconfig wlan scan | perl -C -MEncode=decode -pE 's{\bnwid 0x(\p{AHex}+)\K\b}{ 
my $n = decode("UTF-8", pack "H*", $1) =~ s/\P{Print}//gr; $n ? qq{ ("$n")} : 
""  }e'

Or, the more verbose:

$ cat ~/bin/wlanscan
#!/usr/bin/perl
# perldoc perlunicook
use utf8;      # so literals and identifiers can be in UTF-8
use v5.12;     # or later to get "unicode_strings" feature
use strict;    # quote strings, declare variables
use warnings;  # on by default
use warnings  qw(FATAL utf8);    # fatalize encoding glitches
use open      qw(:std :encoding(UTF-8)); # undeclared streams in UTF-8

use Encode qw< decode >;

my $if = shift || 'wlan';

open my $fh, '-|', 'ifconfig', $if, 'scan' or die "Unable to exec ifconfig: $!";
while ( my $line = readline $fh ) {
        $line =~ s{\b nwid \s+ 0x(\p{PosixXDigit}+)\K \b}{ decode_nwid($1) }ex;
        print $line;
}
close $fh or die "Error closing ifconfig: $!";

sub decode_nwid {
        my $nwid = decode 'UTF-8', pack "H*", $_[0];
        $nwid =~ s/\P{Print}//g;
        return $nwid ? qq{ ("$nwid")} : '';
}


Reply via email to