본문 바로가기
C++ 200제/코딩 IT 정보

[TypeScript] 문자열 <-> UTF8, UTF16 진수 한글 변환 (HEX to string)

by vicddory 2019. 12. 26.

예전 글에서 자바스크립트를 활용한 문자열과 hex 변환 방법을 소개했는데요. "[JavaScript] 문자열 <-> UTF8, UTF16 진수 한글 변환 (HEX to string)"


이 포스트에선 자바스크립트 소스 코드를 타입스크립트로 변환하여 소개합니다. 저도 아직 TypeScript가 익숙한 편이 아니라 타입스크립트를 타입스크립트 처럼 명확히 이용했는지 약간 의구심은 듭니다.


그래도, 프로젝트 소스에 올려 잘 구동하는 것 확인했으니 TypeScript 사용 중이시라면 한 번 쯤 참고해 보시는 게 좋다고 생각합니다.



prototype001.js --- UTF8⇔16 진수 문자열 변환 Javascript

// 문자열을 UTF8 16 진수 문자열로 변환 


stringToUtf8HexString = (text: any) => {

  const bytes1 = util.stringToUtf8Bytes(text);

  const hexStr1 = util.bytesToHexString(bytes1);

  return hexStr1;

};


// 문자열을 UTF8 바이트 배열로 변환


stringToUtf8Bytes = (text: any) => {

  const result: any[] = [];


  if (text == null) return result;


  for (let i = 0; i < text.length; i++) {

    const c = text.charCodeAt(i);


    if (c <= 0x7f) {

      result.push(c);

    } else if (c <= 0x07ff) {

      result.push(((c >> 6) & 0x1f) | 0xc0); // eslint-disable-line no-bitwise

      result.push((c & 0x3f) | 0x80); // eslint-disable-line no-bitwise

    } else {

      result.push(((c >> 12) & 0x0f) | 0xe0); // eslint-disable-line no-bitwise

      result.push(((c >> 6) & 0x3f) | 0x80); // eslint-disable-line no-bitwise

      result.push((c & 0x3f) | 0x80); // eslint-disable-line no-bitwise

    }

  }

  return result;

};


eslint airbnb에선 >> << 이런 연산을 허용하지 않아요. 그래서 오른쪽 처럼 주석 형태 커맨드 삽입이 필요합니다.


// 16 진수 문자열을 바이트 값으로 변환 


hexToByte = (hexStr: string) => {

  return parseInt(hexStr, 16);

};


// 바이트 배열을 16 진수 문자열로 변환 


hexStringToBytes = (hexStr: any) => {

  const result = [];


  for (let i = 0; i < hexStr.length; i += 2) {

    result.push(util.hexToByte(hexStr.substr(i, 2)));

  }


  return result;

};


// UTF8 바이트 배열을 문자열로 변환


utf8BytesToString = (arr: any) => {

  let result: string = '';

  let i;


  while (arr.length !== 0) {

    i = arr.shift();


    if (i <= 0x7f) {

      // eslint-disable-line no-bitwise

      result += String.fromCharCode(i);

    } else if (i <= 0xdf) {

      let c = (i & 0x1f) << 6; // eslint-disable-line no-bitwise

      c += arr.shift() & 0x3f; // eslint-disable-line no-bitwise

      result += String.fromCharCode(c);

    } else if (i <= 0xe0) {

      let c = ((arr.shift() & 0x1f) << 6) | 0x0800; // eslint-disable-line no-bitwise

      c += arr.shift() & 0x3f; // eslint-disable-line no-bitwise

      result += String.fromCharCode(c);

    } else {

      let c = (i & 0x0f) << 12; // eslint-disable-line no-bitwise

      c += (arr.shift() & 0x3f) << 6; // eslint-disable-line no-bitwise

      c += arr.shift() & 0x3f; // eslint-disable-line no-bitwise

      result += String.fromCharCode(c);

    }

  }


  return result;

};


// 바이트 값을 16 진수 문자열로 변환


byteToHex = (byteNum: any) => {

  const digits = byteNum.toString(16);

  const rtn = '0';

  const rtn2 = rtn + digits;


  if (byteNum < 16) return rtn2;


  return digits;

};


// 바이트 배열을 16 진수 문자열로 변환


bytesToHexString = (bytes: any) => {

  let result = '';


  for (let i = 0; i < bytes.length; i++) {

    result += util.byteToHex(bytes[i]);

  }

  return result;

};


// UTF8 16 진수 문자열을 문자열로 변환


utf8HexStringToString = (hexStr1: any) => {

  const bytes2 = util.hexStringToBytes(hexStr1);

  const str2: string = util.utf8BytesToString(bytes2);

  return str2;

};


사용 방법은 예전 포스트 참조하시면 되고요.

타입스크립트 사용 중에 에러가 발생한다면 댓글로 알려주세요. 함께 방법을 찾아봐요.



댓글