On Thu, Sep 13, 2018 at 7:22 AM WFB <wbi...@gmx.at> wrote:
>
> Hi all,
>
> My perl6 runs an executable and prints its output. This output is printed as 
> multibyte string. I assume the executable gives back a multibyte string and 
> perl6 interpret its as one byte string for whatever reasons.
> I tried Run with different encodings like windows-1251, utf16 and so on. No 
> luck.
>
> The string I get looks like that:
> S e t t i n g   u p   f o l d e r   C : \ U s e r s \ w o l f
> Hex:
> 53 00 65 00 74 00 74 00 69 00 6E 00 67 00 20 00 75 00 70 00 20 00 66 00 6F 00 
> 6C 00 64 00 65 00 72 00 20 00 43 00 3A 00 5C 00 55 00 73 00 65 00
>
> Here my program:
>
> my $installer = run $install-file, :out;
> for $installer.out.lines -> $line {
>     say $line;
> }
>
> Any idea whats wrong here. A WIndows issue or do I something wrong?
>

Windows uses UTF16 encoding by default (which you see here), while
Perl 6 uses UTF8 by default.

You should be able to fix it by setting the encoding
(Note that it should probably be set with :encoding<utf16>, but that
doesn't work currently)

    run $install-file, :out, :enc<utf16>

Though I currently get an error from that.

    Streaming decode NYI for encoding 4

Also I'm sure I should be able to set it after that line, but it also
produces an error

    > my $installer = run $install-file, :out;
    > $installer.out.encoding('utf16');
    Cannot assign to an immutable value

---

A work around is to use 'latin1' (almost binary) and use `.encode.decode`

    my $installer = run $install-file, :out, :enc<latin1>;
    for $installer.out.lines.map(*.encode('latin1').decode('utf16')) -> $line {
        say $line;
    }

Reply via email to