Erlang NIF странное поведение Iolist - PullRequest
0 голосов
/ 31 января 2020

Я только начал экспериментировать с Erlang NIFS и застрял с этой проблемой, и мне интересно, можно ли что-нибудь с этим сделать.

Вот NIF:

#include "erl_nif.h"

static ERL_NIF_TERM test_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
{
    ErlNifBinary binary;
    if (!enif_inspect_iolist_as_binary(env, argv[0], &binary)) {
        return enif_make_badarg(env);
    }

    printf("%s\n", binary.data);

    return enif_make_int(env, 0);
}

static ErlNifFunc nif_funcs[] = {
    {"test", 1, test_nif}
};

ERL_NIF_INIT(nif_test, nif_funcs, NULL, NULL, NULL, NULL)

и некоторые выводит, когда я вызываю функцию из erlang:

nif_test:test(<<"helló">>). % hell?
nif_test:test(<<"áéíóöőüű">>). % ?????Q?q
nif_test:test("hello"). % helloErlU?
nif_test:test(""). % xc?
nif_test:test("out"). % outg", "U?

Было бы неплохо получить хотя бы двоичные строки для правильной работы. Любые идеи?

Редактировать: Я забыл, что на самом деле мне нужны данные в виде строки (char *) в программе C, так что я мог бы начать все это неправильно.

1 Ответ

2 голосов
/ 31 января 2020

Первые два потому, что printf не соблюдает кодировку символов, которую вы используете в исходном файле Erlang (вероятно, UTF-8).

Остальное, потому что ErlNifBinary не равно нулю прекращается. Вам также необходимо обратить внимание на binary.size. Как то так:

 printf("%.*s", binary.size, binary.data);
...