Я храню названия стран в базе данных 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, и как мне go сделать это? Я предполагаю, что, поскольку именно веб-приложение отображает текст, именно здесь и должно произойти изменение, но я не уверен, как это сделать.
Редактировать: Просто чтобы уточнить, я пытались получить предоставленные ответы, но они, похоже, тоже не работают:
var labelArray = data.subarray(4, 4 + nameLength);
var label = new TextDecoder("utf-8").decode(labelArray);
, что приводит к следующему: