Как работать с символами не-ASCII UTF-8 в моем стеке приложений

Я храню названия стран в базе данных 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);

что приводит к этому:

ох2


person Walter    schedule 07.02.2020    source источник
comment
Вероятно, это fromCharCode() в JavaScript, да. Вы обрабатываете каждый байт так, как будто это независимая кодовая точка, а не часть многобайтовой кодировки. Вероятно, есть гораздо более простой подход, чем весь этот байтовый поток, если вы читали документацию по cpprest и JavaScript.   -  person Shawn    schedule 08.02.2020
comment
Почему вы не будете взаимодействовать с JavaScript, как обычно, используя JSON?   -  person rustyx    schedule 08.02.2020
comment
Веб-приложение не является стандартным веб-приложением, оно интерактивно, поэтому мы пытаемся выжать из него как можно больше производительности, и удаление синтаксического анализа JSON (как на стороне сервера, так и на стороне клиента) является одним из способов, которым мы сжимаем систему. .   -  person Walter    schedule 08.02.2020
comment
Я очень сомневаюсь, что new TextDecoder("utf-8").decode() будет быстрее, чем позволить движку JS анализировать JSON изначально, для чего он оптимизирован. При кодировании содержимого gzip также будет небольшая разница в размере полезной нагрузки.   -  person rustyx    schedule 12.02.2020


Ответы (1)


person    schedule
comment
Спасибо за ответ, но, к сожалению, он не сработал, я обновил свой вопрос, чтобы отразить, что происходит с этим решением. - person Walter; 08.02.2020