강의

멘토링

커뮤니티

Cộng đồng Hỏi & Đáp của Inflearn

Hình ảnh hồ sơ của geekgleeguru5720
geekgleeguru5720

câu hỏi đã được viết

Cách mạng phát triển Web: Khóa học Masterclass WebAssembly bắt đầu với C, C++, và Rust

Gọi hàm JavaScript từ ngôn ngữ C phần 2

UTF8ToString 인코딩 질문있습니다.

Đã giải quyết

Viết

·

176

·

Đã chỉnh sửa

1

#include <iostream>
#include <string>
#include <emscripten.h>
#include <emscripten/bind.h>

using namespace std;

EM_JS(void, call_js, (const string subject, const string msg), {
  console.log("Subject: js " + subject, UTF8ToString(msg));
  console.log("Pointer: js " + msg, UTF8ToString(subject));
  jsFunction(UTF8ToString(subject), UTF8ToString(msg));
});

bool my_calls()
{
  const string subject = "제목";
  const string msg = "메세지";

  cout << "Subject: cpp " << subject << "\nPointer: cpp " << msg << endl;

  call_js(subject, msg);
  return true;
}

EMSCRIPTEN_BINDINGS(my_module)
{
  emscripten::function("callJs", &my_calls);
}

UTF8ToString으로 변환할때 포인터와 length로 변환하야하나요?

string 타입을 직접 utf8로 변환해도 되는것 같은데 해당방식으로 문제가 생길 수 있는지 궁금합니다.

 

qtwebassemblywasm

Câu trả lời 1

0

qtdev님의 프로필 이미지
qtdev
Người chia sẻ kiến thức

안녕하세요. geekgleeguru 님,

UTF8ToString은 Emscripten의 메모리에서 특정 포인터를 가져와 문자열로 변환합니다. 그러나 C++의 std::string 객체를 이 방법으로 처리하려고 하면 문제가 발생할 수 있습니다.

std::string은 메모리 내에서 문자열을 보관하며, 직접 포인터와 길이를 사용하여 접근하는 것이 아닙니다. C++에서 JavaScript로 문자열을 전달할 때는 보통, std::string 객체의 .c_str() 메서드를 사용하여 문자 열의 C 스타일 포인터를 얻고, JavaScript에서는 이를 적절히 처리합니다.

위와 같이 사용하면 문자열을 전달할 수 있습니다. 아래는 C++ 문자열을 JavaScript로 전달하고, JavaScript에서 이를 올바르게 처리하는 수정된 코드 예시입니다.

#include <iostream>
#include <string>
#include <emscripten.h>
#include <emscripten/bind.h>

using namespace std;

EM_JS(void, call_js, (const char* subject, const char* msg), {
  console.log("Subject: js " + UTF8ToString(subject));
  console.log("Pointer: js " + UTF8ToString(msg));
  jsFunction(UTF8ToString(subject), UTF8ToString(msg));
});

bool my_calls()
{
  const string subject = "제목";
  const string msg = "메세지";

  // printf("Subject: %s\nPointer: %s\n", subject.c_str(), msg.c_str());
  cout << "Subject: cpp " << subject << "\nPointer: cpp " << msg << endl;

  call_js(subject.c_str(), msg.c_str());
  return true;
}

EMSCRIPTEN_BINDINGS(my_module)
{
  emscripten::function("callJs", &my_calls);
}

 

혹시 더 궁금한게 있으면 언제든지 질문해주세요.

감사합니다. 김대진 드림.

 

 

geekgleeguru님의 프로필 이미지
geekgleeguru
Người đặt câu hỏi

빠른답변 감사합니다

Hình ảnh hồ sơ của geekgleeguru5720
geekgleeguru5720

câu hỏi đã được viết

Đặt câu hỏi