RapidJSON и UNICODE в VisualStudio 2013

Я столкнулся с проблемой, которую не знаю, как ее решить. Вот мой код.

#include "rapidjson/write.h"
#include "rapidjson/stringbuffer.h"

...

void WriteResultToJSON()
{
  CHAR a[] = "a";
  TCHAR b[] = _T("b");
  WCHAR c[] = L"c";

  StringBuffer s;
  Writer<StringBuffer> writer(s);
  writer.StartObject();
  writer.String("A:");
  writer.String(a);
  writer.String("B");
  writer.String(b);
  writer.String("C");
  writer.String(c);
  write.EndObject();
  printf(s.GetString());
}

Когда значение набора символов проекта - «Использовать набор символов Unicode», я не могу выполнить компиляцию. Только когда он установлен на «Использовать многобайтовый набор символов».

Ошибка говорит:

no instance of overloaded function "rapidjson::Writter<OutputStream, SourceEncoding, Target Encoding, StackAllocator>::String [with OutputStream=rapidjson::StringBuffer, SourceEncoding=rapidjson::UTF8<char>,TargetEncoding=rapidjson::UTF8<char>, StackAllocator=rapidjson::CtrAllocator]" matches the argument list
 argument types are (TCHAR  [2])
 object type is: rapidjson::Writter<rapidjson::StringBuffer, rapidjson::UTF8<char>, rapidjson::UTF8<char>, rapidjson::CrtAllocator>

У меня плохое предчувствие, что Rapidjson поддерживает только utf8, и он не будет работать с моим текущим проектом, который находится в utf16, или есть ли способ его использовать, если для набора символов установлено значение Unicode?

Спасибо

ярый


person yary    schedule 25.10.2014    source источник


Ответы (1)


Если вы посмотрите на различные строковые методы класса Writer, все они ожидают ввода const SourceEncoding::Ch*. По умолчанию SourceEncoding равно rapidjson::UTF8, а Ch равно char. Чтобы принять ввод wchar_t*, вы должны указать rapidjson::UTF16 (или rapidjson::UTF16LE) как SourceEncoding, например:

void WriteResultToJSON()
{
    CHAR a[] = "a";
    TCHAR b[] = TEXT("b");
    WCHAR c[] = L"c";

    StringBuffer s;
    Writer< StringBuffer > writerUTF8(s); // UTF-8 input
    Writer< StringBuffer, UTF16<> > writerUTF16(s); // UTF-16 input

    writerUTF8.StartObject();
    writerUTF8.String("A:");
    writerUTF8.String(a);
    writerUTF8.String("B");

    #ifdef UNICODE
    writerUTF16.String(b);
    #else
    writerUTF8.String(b);
    #endif

    writerUTF8.String("C");
    writerUTF16.String(c);

    writerUTF8.EndObject();
    printf(s.GetString());
}
person Remy Lebeau    schedule 26.10.2014
comment
Большое спасибо @Remy, просто заметка для других людей с той же проблемой. Не забудьте позвонить writerUTF16.StartObject() - person yary; 28.10.2014
comment
Это зависит от того, как вы хотите, чтобы JSON выглядел. StartObject() запускает новый объект и, таким образом, записывает открытый { в StringBuffer`. Если вы просто пытаетесь записать строку UTF-16 в существующий объект, вы не хотите создавать новый объект. - person Remy Lebeau; 28.10.2014
comment
может я не совсем понимаю это. Когда я использовал один и тот же StringBuffer s для writerUTF8 и writerUTF16, его можно было скомпилировать, но приложение вылетело (была вызвана R6010 abort ()). Я не могу найти, что именно означает эта конструкция Writer< StringBuffer > writerUTF8(s); Writer - это класс, но какова цель <? Я предполагаю, что это перегружает, но никогда не видел подобного синтаксиса и не могу найти страницу с объяснением. - person yary; 29.10.2014