> On 9 Jun 2021, at 06:34, Paul Procacci <pproca...@gmail.com> wrote:
> 
> Hopefully a pretty quick question....
> 
> GIven the following:
> 
> my Buf $b .= new([72, 105, 0, 32, 97, 103, 97, 105, 110, 0]);
> say $b.decode;
> 
> I would expect this to print 'Hi'.
> Instead it prints 'Hi again'.
> 
> https://docs.raku.org/type/Buf#(Blob)_method_decode 
> 
> The decode documentation for Buf only states that 'Applies an encoding to 
> turn the blob into a Str; the encoding will be UTF-8 by default.'             
>                                                                  
> 
> The zero (0) in that Buf should imply an end of string yet decode seems to 
> want to decode the number of elements instead.

That is an incorrect assumption carried over from C.  In the Raku Programming 
Language, a null byte is a valid grapheme, as it is in unicode.  A small change 
to your program:

    my Buf $b .= new(72, 105, 0, 32, 97, 103, 97, 105, 110, 0);
    .say for $b.decode.uninames;
    #####
    LATIN CAPITAL LETTER H
    LATIN SMALL LETTER I
    <control-0000>
    SPACE
    LATIN SMALL LETTER A
    LATIN SMALL LETTER G
    LATIN SMALL LETTER A
    LATIN SMALL LETTER I
    LATIN SMALL LETTER N
    <control-0000>


> Furthermore, If I 'say $b.decode.chars;' it counts the initial null as part 
> of Str.
> In my mind, that means Str doesn't really mean string.

I don't see an initial null in your example.

But yeah, the Str class in Raku is much more than a C-string.


> So the question, how does one ACTUALLY decode what's in a buffer to a string 
> where it adheres to the semantics of NULL termination for strings cleanly.

If you want to include the null byte in your final strings:

    my @strings = $b.decode.comb(/ .*? "\0" /)

would be a way.



> Another question might be, should decode() follow null terminating semantics 
> instead of number of elements in a given Buf.

No.  The C-string semantics are what they are.  They are not the semantics used 
in the Raku Programming Language.



Liz

Reply via email to