In Perl ist das ganz einfach: Wenn Du _nicht_ dekodierst, hast Du Bytes. Wenn Du dekodierst, hast Du einen String.
Bullshit.
Hach Beat, wenn Du das sagst.
#!/usr/bin/perl
use strict;
use warnings;
use CGI;
use Encode ();
my $cgi = CGI->new;
my $utf8Parm = $cgi->param('utf8Parm'); # utf-8 kodiert übergeben: '€urö'
print 'Content-type: text/plain', "\n\n";
print 'LEN:', length($utf8Parm), "\n"; # 7
print 'STRINGLEN:', length(Encode::decode('UTF-8', $utf8Parm)), "\n"; # 4