1

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」が出力されるだけです-構造体がchar *を使用するように定義を変更すると(そしてASCII文字のみをプッシュします)、正常に動作します。ただし、 wchar_t* 文字列を適切にシリアル化および逆シリアル化する方法がわかりません。

4

1 に答える 1

2

以前に tpl を使用したことはありませんが、ドキュメントをざっと見てみると、ワイド文字を直接サポートしていないようです。文字列「1234」で見られる動作は、バイト「1\x002\x003\x004\x00\x00\x00」を含むUTF-16コード化された文字列と一致しており、tplによってNUL終了バイトとして扱われます文字列「1\x00」。

あなたの最良の選択肢はおそらく次のようです:

  • ワイド文字列を tpl で 16 ビット整数の配列として表します。
  • 文字列を UTF-8 文字列としてエンコードcharし、tpl 文字列型を使用します。また
  • tpl を変更して、ワイド文字列型を含めます。
于 2010-09-12T09:54:57.763 に答える