티스토리 뷰
[TypeScript] 문자열 <-> UTF8, UTF16 진수 한글 변환 (HEX to string)
vicddory 2019. 12. 26. 07:00목차
예전 글에서 자바스크립트를 활용한 문자열과 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;
};
사용 방법은 예전 포스트 참조하시면 되고요.
타입스크립트 사용 중에 에러가 발생한다면 댓글로 알려주세요. 함께 방법을 찾아봐요.