2010-09-12 1 views
1

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

код у меня выглядит так, и это не работает:

#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» - если я изменить так что структура пользователей char * (и я просто нажимаю на них символы ASCII), она работает нормально. Однако я не могу понять, как правильно его сериализовать и десериализовать строки wchar_t *.

ответ

2

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

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

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

Ах, я пропустил часть документов, которые говорили о том, как назначить какой из неограниченных массивов в структуре, которую вы добавляли. Спасибо за ответ! –

 Смежные вопросы

  • Нет связанных вопросов^_^