Как работать с не-ASCII UTF-8 символами в моем стеке приложений - PullRequest
1 голос
/ 08 февраля 2020

Я храню названия стран в базе данных 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-символы, тогда я получаю эту мерзость:

uh oh

Мое понимание UTF-8 состоит в том, что он хранит символы ASCII как нормальные, но не ASCII-символы в нескольких байтах.

Какую часть моего стека приложений необходимо указать, когда и где использовать несколько байтов для символов, не относящихся к ASCII, и как мне go сделать это? Я предполагаю, что, поскольку именно веб-приложение отображает текст, именно здесь и должно произойти изменение, но я не уверен, как это сделать.

Редактировать: Просто чтобы уточнить, я пытались получить предоставленные ответы, но они, похоже, тоже не работают:

var labelArray = data.subarray(4, 4 + nameLength);                  
var label = new TextDecoder("utf-8").decode(labelArray);

, что приводит к следующему:

uh oh2

1 Ответ

1 голос
/ 08 февраля 2020
var data = new Uint8Array(request.response);
var string = new TextDecoder("utf-8").decode(data);
...