인프런 커뮤니티 질문&답변

geekgleeguru님의 프로필 이미지

작성한 질문수

WebAssembly, 이제는 웹도 C/C++/Rust를 이용해 개발하자!

C언어에서 JavaScript 함수 호출 2편

UTF8ToString 인코딩 질문있습니다.

해결된 질문

24.08.16 15:35 작성

·

42

·

수정됨

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로 변환해도 되는것 같은데 해당방식으로 문제가 생길 수 있는지 궁금합니다.

 

답변 1

0

김대진님의 프로필 이미지
김대진
지식공유자

2024. 08. 16. 15:56

안녕하세요. 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
질문자

2024. 08. 16. 16:24

빠른답변 감사합니다