inflearn logo
강의

Course

Instructor

Innovation in Web Development: WebAssembly Master Class Starting with C, C++, and Rust

Calling JavaScript Functions from C Part 2

UTF8ToString 인코딩 질문있습니다.

Resolved

185

geekgleeguru

7 asked

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

 

qt webassembly wasm

Answer 1

0

qtdev

안녕하세요. 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);
}

 

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

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

 

 

0

geekgleeguru

빠른답변 감사합니다

Build system의 Obs 에 관한 질문

1

29

2

로드맵 재수강 로드맵 할인문의

1

43

2

강의 재수강 문의

1

54

2

강의 연장 문의

1

79

2

강의 자료 ppt나 pdf 파일은 없을까요?

0

69

1

강의 연장 질문

1

60

2

Rust는 어떻게 컴파일 타임에 dangling reference를 막나요?

0

70

2

22강 후반부와 23강 전반부의 내용이 겹칩니다.

1

58

1

강의 추가 계획 질문

0

76

2

코드 크가가 너무 작은대 이거 화면확대 어떻게 하나요?

0

166

4

강의 자료 pdf 다운로드 할 수 있을까요?

0

95

3

혹시 강의 연장 가능할까요? ㅠㅠ

1

73

2

테스트 배포시 에러가 발생합니다.

0

121

2

달력 31일까지 나오지 않음.

1

75

2

parent.width 관련 질문.

1

66

2

custom Widget 강의 에서 알려주신 promoted widgets 질문 드립니다.

1

118

2

소유권 이전과 관련된 질문입니다

0

148

2

QT와 QT Designer에 대한 질문 사항

1

167

2

mutex, incNumber는 global 안붙여도 되는건가요?

1

115

2

build system 선택창

1

309

1

리눅스 개발환경 구성 시 Ubuntu 22.04LTS 필요 여부

1

733

2

강의 노트(PPT) 파일은 제공이 안되는 건가요?

1

407

1

clock 예제 빌드 오류

1

490

1

Wasm windows 개발환경 구축 중 오류

2

701

1