javascript - 如何在我的应用程序堆栈中处理非ASCII UTF-8字符

标签 javascript c++ sqlite utf-8 cpprest-sdk

我将国家/地区名称存储在通过cpprest服务器公开的sqlite数据库中。我的Web应用程序正在查询这些国家名称,服务器返回的结果是原始二进制字符串(八位字节流),这些字符串具有名称长度和嵌入其中的名称的实际字符。

我正在将国名读为std::string值,如下所示:

country->Label = std::string((const char*)sqlite3_column_text(Query.Statement, 1));

然后,我将它们复制到std::vector<char>缓冲区中,然后通过cpprest API发送回去
Concurrency::streams::bytestream::open_istream<std::vector<char>>(buffer);

当我的Web应用程序接收到数据时,我将其解码为:
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字符,我将如何去做?我的猜测是,由于Web应用程序就是显示文本的应用程序,因此这是需要进行更改的地方,但是我不确定该怎么做。

编辑:
为了澄清,我尝试了提供的答案,但是它们似乎也不起作用:
var labelArray = data.subarray(4, 4 + nameLength);                  
var label = new TextDecoder("utf-8").decode(labelArray);

结果是:

uh oh2

最佳答案

var data = new Uint8Array(request.response);
var string = new TextDecoder("utf-8").decode(data);

关于javascript - 如何在我的应用程序堆栈中处理非ASCII UTF-8字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60122184/

相关文章:

java - 让SQLite删除表中的所有记录

javascript - 在文档或下载的超链接旁边显示实际文件大小

c++ - OpenCV 3.0 findContours 崩溃

c++ - 将 vlfeat 库的 dsift 与 cv::Mat 结合使用

c++ - 参数化查询中的参数计数不匹配

.net - 将 Entity Framework 4.1 与 SQLITE 结合使用

javascript - jquery,在制表符上阻止焦点在 iframe 中,但不在其内部的输入中

javascript - 有没有办法让 HTML 元素溢出 : scroll DIV always remain on top of other elements?

javascript - Node.js 如何用一个线程处理并发请求?

C++ 访问类成员的操作顺序