sub write {
@_ == 3 or croak 'Usage: $sftp->write($fh, $data)';
my ($sftp, $rfh) = @_;
$sftp->flush($rfh, 'in') or return undef;
if (utf8::is_utf8($_[2])) {
splice(@_, 2, 1, "$_[2]"); # Don't affect caller.
utf8::downgrade($_[2], 1) # Change format to bytes.
or carp("Can only write bytes to a socket");
}
...
####
use strict;
use warnings;
use Encode qw( encode );
my $enc = 'iso-latin-1'; # Desired encoding
my $text = chr(130); # Any char supported by iso-latin-1 and $enc
utf8::downgrade(my $text_off = $text);
utf8::upgrade (my $text_on = $text);
# Encode text on output
my $from_off = encode($enc, $text);
my $from_on = encode($enc, $text);
print("bytes are ", ($from_off eq $from_on ? 'same' : 'diff'), "\n");
####
bytes are same
####
use strict;
use warnings;
utf8::downgrade( my $bytes_off = '' );
$bytes_off .= chr($_) for 0..255;
utf8::upgrade( my $bytes_on = '' );
$bytes_on .= chr($_) for 0..255;
# Downgrade variable on output to avoid false positive.
utf8::downgrade( my $from_off = $bytes_off );
utf8::downgrade( my $from_on = $bytes_on );
print("bytes are ", ($from_off eq $from_on ? 'same' : 'diff'), "\n");
####
bytes are same