我在写节点。js前端
DAB development board
,最终将在树莓派上运行。我是一名Java和web开发人员,我正在与C++和不同类型字符串之间的转换进行斗争。
DAB板带有一个C++SDK,具有许多方便的功能。它允许我使用
GetTotalProgram()
。对于我可以调用的每个程序
GetProgramName
获取程序名称:
GetProgramName(char mode, long dabIndex, char namemode, wchar_t * programName)
哪里
mode
方法
FM
或
DAB
,
namemode
表示长或短名称。程序名称将在
programName
.
为了转换
wchar_t *programName
进入
v8::String
,我找到了我正在使用的这个片段,并了解了以下内容的基础知识:
wchar_t buff[300];
char cbuff[600];
GetProgramName(0, i, 1, buff);
wcstombs( cbuff, buff, wcslen(buff) );
Local<String> str = String::NewFromUtf8(isolate, (const char *) cbuff, v8::String::kNormalString, wcslen(buff));
我遍历可用的程序并建立一个
v8::Array
:
void GetPrograms(const FunctionCallbackInfo<Value>& args) {
Isolate* isolate = Isolate::GetCurrent();
HandleScope scope(isolate);
wchar_t buff[300];
char cbuff[600];
int numberOfPrograms, i;
numberOfPrograms = GetTotalProgram();
Local<v8::Array> ARRAY = Array::New(isolate, totalprogram);
for (i = 0; i < numberOfPrograms; i++) {
if (GetProgramName(0, i, 1, buff)) {
wcstombs( cbuff, buff, wcslen(buff) );
Local<String> str = String::NewFromUtf8(isolate, (const char *) cbuff, v8::String::kNormalString, wcslen(buff));
Local<Object> obj = Object::New(isolate);
obj->Set(String::NewFromUtf8(isolate, "name"), str);
ARRAY->Set(i, obj);
}
}
args.GetReturnValue().Set(ARRAY);
}
我从Node应用程序调用C++方法:
var programs = ext.getPrograms();
for (var i = 0; i < programs.length; i++) {
console.log(programs[i][name]);
}
这通常有效,但当程序名包含非ASCII字符时,如
Ã
,
Ã
,
Ã
这个
下一个
ARRAY中的元素具有borked名称
.
下面是Node片段实际输出的内容(
console.log
),与预期产量相比:
| ACTUAL | EXPECTED |
| --------- | ---------- |
| NRK SUPER | NRK SUPER |
| NRK VUPER | NRK VÃR |
| NRK P1 ER | NRK P1 |
似乎非ASCII字符导致下一个
wcstombs
提前退出,而不是复制后面的字符。
为什么会发生这种情况?是否有更好的方法来创建
v8::字符串
从我的
wchar_t
?
注:
我现在能够将这个问题归结为
wcostobs公司
在Raspberry Pi上运行时使用。以下代码:
#include <stdio.h>
#include <string>
#include <cstring>
#include <cstdlib>
char cbuff[600];
wchar_t buff[300] = L"ABCø123abc";
int main( int argc, const char* argv[] ) {
wcstombs( cbuff, buff, wcslen(buff) );
wprintf(L"wcslen of wchar_t array: %u - strlen of char array: %u\n", (char) wcslen(buff), strlen(cbuff));
}
在Mac上运行时,输出
wcslen of wchar_t array: 10 - strlen of char array: 10
,
但当在树莓上运行时,输出
wcslen of wchar_t array: 10 - strlen of char array: 3
-也就是说,它只计算
ø
性格
这看起来类似于
this unanswered question
.