Я храню названия стран в базе данных sqlite, доступной через сервер cpprest. Эти названия стран запрашиваются моим веб-приложением, и результаты, возвращаемые сервером, представляют собой необработанные двоичные строки (потоки октетов), в которых есть длина имени и фактические символы имени, встроенные в него.
Я читаю названия стран в значение std::string
следующим образом:
country->Label = std::string((const char*)sqlite3_column_text(Query.Statement, 1));
Затем я копирую их в буфер std::vector<char>
, который затем отправляется обратно через API cpprest через
Concurrency::streams::bytestream::open_istream<std::vector<char>>(buffer);
Когда мое веб-приложение получает данные, я декодирую их так:
var data = new Uint8Array(request.response);
var dataView = new DataView(data.buffer);
var nameLength = dataView.getUint32(0, true);
var label = "";
for(var k = 0 ; k < nameLength; k++)
{
label += String.fromCharCode([dataView.getUint8(k + 4)])
}
По большей части это работает нормально, пока я не сталкиваюсь с названием страны, которое содержит символы, отличные от ASCII, тогда я получаю эту мерзость:
Мое понимание UTF-8 заключается в том, что он хранит символы ASCII как обычно, но не-ASCII-символы в нескольких байтах.
Какая часть моего стека приложений должна быть указана, когда и где использовать несколько байтов для символов, отличных от ASCII, и как мне это сделать? Я предполагаю, что поскольку веб-приложение показывает текст, именно здесь должно произойти изменение, но я не знаю, как это сделать.
Изменить: просто чтобы уточнить, я попытался дать ответы, но они, похоже, тоже не работают:
var labelArray = data.subarray(4, 4 + nameLength);
var label = new TextDecoder("utf-8").decode(labelArray);
что приводит к этому:
fromCharCode()
в JavaScript, да. Вы обрабатываете каждый байт так, как будто это независимая кодовая точка, а не часть многобайтовой кодировки. Вероятно, есть гораздо более простой подход, чем весь этот байтовый поток, если вы читали документацию по cpprest и JavaScript. - person Shawn   schedule 08.02.2020new TextDecoder("utf-8").decode()
будет быстрее, чем позволить движку JS анализировать JSON изначально, для чего он оптимизирован. При кодировании содержимого gzip также будет небольшая разница в размере полезной нагрузки. - person rustyx   schedule 12.02.2020