Сериализация wchar_t * в структуре с TPL - PullRequest
1 голос
/ 12 сентября 2010

Я пытаюсь использовать tpl для сериализации структур, содержащих строки wchar_t *.

Код, который я имею, выглядит так, и он не работает:

#include <stdio.h>
#include <locale.h>
#include <string.h>
#include <wchar.h>
#include "tpl.h"

struct chinese_t {
    wchar_t *chars;
};


int main() {

tpl_node *tn;


struct chinese_t cstr;
cstr.chars = L"字符串";

tn = tpl_map("S(s)", &cstr);
tpl_pack( tn, 0 );
tpl_dump(tn, TPL_FILE, "string.tpl");
tpl_free(tn);


struct chinese_t cstr2;

tn = tpl_map( "S(s)", &cstr2);
//tpl_load(tn, TPL_MEM, buffer, len);
tpl_load(tn, TPL_FILE, "string.tpl");
tpl_unpack(tn, 0);
tpl_free(tn);


printf("%ls\n", cstr2.chars);
return;
}

Если я заменяюв китайской строке «字符串» с «1234» она просто печатает «1» - если я изменю определение так, чтобы struct использовала символ * (а я в него вставляю только символы ASCII), это работает просто отлично.Однако я не могу понять, как заставить его сериализовать и десериализовать строки wchar_t * должным образом.

1 Ответ

2 голосов
/ 12 сентября 2010

Я раньше не использовал tpl, но из краткого обзора документации не видно, что он напрямую поддерживает широкие символы. Поведение, которое вы видите для строки «1234», согласуется с кодированной строкой UTF-16, содержащей байты «1 \ x002 \ x003 \ x004 \ x00 \ x00 \ x00», которые обрабатываются tpl как просто байт с NUL-завершением строка "1 \ x00".

Похоже, ваши лучшие варианты:

  • Представляет ваши строки широких символов в tpl как массивы 16-битных целых чисел;
  • Кодируйте ваши строки как строки UTF-8 char и используйте тип строки tpl; или
  • Измените tpl для включения типа строки широких символов.
...