Erlang NIF 奇怪的 iolist 行为

Erlang NIF weird iolist behavior

我刚开始尝试使用 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?

最好至少让二进制字符串正常工作。有什么想法吗?

编辑: 我忘记了我真正需要的是 C 程序中作为字符串 (char *) 的数据,所以我可能一开始就错了。

前两个是因为 printf 不支持您在 Erlang 源文件中使用的任何字符编码(可能是 UTF-8)。

其余的是因为 ErlNifBinary 不是空终止的。您还需要注意binary.size。像这样:

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