В проекте C ++ / winrt у меня есть большое количество небольших ресурсов svg, которые нужно загрузить из файла. Поскольку было бы медленно перезагружать их все с диска при каждом событии CreateResources из CanvasVirtualControl, я загрузил их заранее и сохранил данные для каждого в массиве. Когда происходит CreateResources, я намерен загрузить CanvasSvgDocument для каждого из них с помощью метода CanvasSvgDocument LoadFromXml (System.string). Однако, если я создаю svgDocument с помощью создателя ресурсов, я получаю сбой неверного аргумента при вызове LoadFromXml (). Аргумент resourceCreator выглядит правильно (VS Preview 6 теперь позволяет мне видеть локальные переменные!), А аргумент строки данных xml выглядит как действительные данные svg, поэтому мое лучшее предположение о сбое - это строка данных неправильного формата. Данные файла - UTF-8. Если я конвертирую это в std :: wstring, как я должен для аргумента LoadFromXml, можно ли его по-прежнему понимать как байтовые данные? Например, я создаю std :: wstring таким образом, учитывая указатель на данные файла без знака char и его длину в байтах:
m_data_string = std::wstring(data, data + dataLength);
Когда запускается CreateResources, на эту строку данных ссылаются следующим образом:
m_svg = CanvasSvgDocument(resourceCreator);
m_svg.LoadFromXml(resourceCreator, m_data_string);
Но LoadFromXml вылетает с ошибкой недопустимого параметра. Я вижу, что длина строки данных правильная, но, конечно, это количество символов, а не фактический размер данных. Мог ли быть конфликт между атрибутом UTF-8 в svg и тем фактом, что он теперь записан как 16-битные символы? Если да, то как загрузить XML-документ из таких данных?
[Обновление] с предложением использовать winrt :: to_hstring. Я прочитал беззнаковые данные char в std :: string,
std::string cstring = std::string("");
cstring.assign(data, data + dataLength);
Затем я конвертирую это:
m_data_string = winrt::to_hstring(cstring);
И, наконец, попробуйте загрузить svg, как раньше:
m_svg.LoadFromXml(resourceCreator, m_data_string);
И вылетает как и раньше. Я заметил, что в отладчике, который преобразовал строку, ни в одном случае не выглядела тарабарщиной - в обоих случаях она считывалась в отладчике как ожидаемые данные svg. Но если эта hstring имеет широкие символы, разве это не будет конфликтом с атрибутом в svg, который идентифицирует его как UTF-8?
[Обновление] Я начинаю задаваться вопросом, использовал ли кто-нибудь когда-нибудь CanvasSvgDocument.Draw () для рисования svg, загруженного из файла. Файлы теперь загружаются без сбоев без каких-либо изменений в их внутренней кодировке. Но - они не рисуют. Эти файлы - 239 из них - имеют формат UTF-8, svg 1.1, и они хорошо отображаются при открытии в Edge или любом браузере. Но если я загружаю данные файла в hstring, создаю CanvasSvgDocument, а затем использую CanvasSvgDocument.LoadFromXml для их загрузки, они не будут отображаться при вызове методом рисования CanvasSvgDocument. Другое рисование фигур и т. Д. Отлично работает во время сеанса рисования. Вот что может быть подсказкой: если я вызываю GetXML () для одного из этих SVG после его загрузки, то возвращается только следующее:
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"></svg>
То есть информации о рисовании там нет. Или это все, что должен вернуть GetXml ()? Это бесполезно. Так что, возможно, CanvasSvgDocument.LoadFromXml (ResourceCreator, String) еще не работает? Итак, я снова задаюсь вопросом: есть ли способ загрузить функциональный CanvasSvgDocument из файловых данных?
std::wstring(data, data + dataLength)
неверно. Он не конвертируется из UTF-8 в UTF-16; он просто расширяет кодовые единицы UTF-8, создавая тарабарщину. Вместо этого используйте winrt :: to_hstring . - person IInspectable   schedule 16.11.2018encoding
из файлов (-ов) SVG XML (если я не читаю документацию неправильно). - person IInspectable   schedule 16.11.2018