Django는 static file을 깔끔하게 관리하기 위해서 staticfiles app을 사용한다.
헷갈리는 STATIC_URLSTATICFILES_DIRSSTATIC_ROOT를 정리해보자 한다.

 

우선 실제 예제를 살펴보고 하나하나 해석해보자

 

1. STATIC_URL은 template에서 static을 사용하기 전에 {% load static %}할때 사용되는녀석(template tag가 사용한다)

2. STATICFILES_DIRS은 local development용으로 사용한다

3. STATIC_ROOT은 실제 production용으로 사용한다

3-2. python manage.py collectstatic을 실행하면 STATIC_ROOT에 지정된 폴더에 Staitc Assets이 복사되어진다

 

'django' 카테고리의 다른 글

Django workers process 메모리 공유  (0) 2021.02.19
Django queryset to json  (0) 2019.12.31
Django related_name(reverse 역참조 )  (0) 2019.11.13
Django Docker 배포(production)  (0) 2019.10.25
DRF ForeignKey Update  (0) 2019.06.14

비동기 Call하면 "그냥 Jquery의 ajax로 다 바르면 되잖아! 근데 자꾸 무슨 Promise냐..." 이렇게 생각하곤했다.

하지만 기술의 발전을 따라 가지 못하면 도태됨으로 Promise를 배웠다.(빠른건 아니지만..) 적용해보니 확실히 코드도 깔끔해지고 좋은것 같다. javascript의 싱글스레드를 좀 더 이해 하는 느낌도 들면서, 고수가 된 느낌도 들면서

 

 

정의 : Promise 개체는 비동기 작업이 맞이할 미래의 완료 또는 실패와 그 결과 값을 나타냅니다. 

 

내 생각: 비동기 Call을 날리고 성공(resolve)과 실패(reject)를 내가 깔끔하게 처리해줄게(Callback 쓰지마세요) 왜냐? 코드가 더러워지니깐 이게 다 깔끔하려고 하는거다

 

코드를보자

 

1. 첫번째 간단한 Promise 예제

// 정의
let p = new Promise((resolve, reject) => {
    let a = 1 + 1;

    if (a === 2) {
        resolve('Success')
    } else {
        reject('False')
    }
});

// 실행
p.then((data => {
    console.log('resolve' + data) // 성공 시 Success
})).catch((data => {
    console.log('reject' + data) // 실패 시 False
}));

간단하게 말해서 Call 날린뒤 성공은 then의 함수가 실패하면 catch의 함수가 실행된다.(이때 함수는 Arrow function을 사용했다) a는 2니깐 당연히 then 함수의 Success가 실행됨!

 

 

2-1. 두번째 Promise 적용 전

const bossLeft = true;
const workLeft = false;

function goToHome(callback, errorCallback) {
    if (bossLeft) {
        errorCallback('아 집에좀 가세요')
    } else if(workLeft) {
        errorCallback('아 일좀 줄여주세요 진짜')
    } else {
        callback('상사도 없고 일도 없으니 집간다')
    }
}


goToHome((message) => {
    console.log(message)
}, (message) => {
    console.log(message)
});

goToHome 집에 가는 함수다. 파라미터로 callback과 errorCallback을 받아서 상사가 남아있냐, 일이 남아있냐에 따라서 실행될 함수가 결정된다.

 

 

2-2. 두번째 Promise 적용 후

const bossLeft = false;
const workLeft = false;

function goToHome() {
    return new Promise((resolve, reject) =>{
        if (bossLeft) {
            reject('아 집에좀 가세요')
        } else if(workLeft) {
            reject('아 일좀 줄여주세요 진짜')
        } else {
            resolve('상사도 없고 일도 없으니 집간다')
        }
    });
}


goToHome().then((message)=>{
    console.log(message);
}).then(()=>{ // 이런식으로 then을 더붙이면 then 실행 후 그 다음 또 실행함
    console.log('그다음 콜백?');
}).catch((message)=>{
    console.log(message)
});

이렇게 코드가 깔끔해진다! goToHome은 파라미터를 받을 필요도 없어지고 new Promise의 reslove, reject로 결정하면된다. 추가로 resolve 호출은 then, 실패는 catch다. 더 추가로 then뒤에 다시 then을 붙이면 또 실행된다. 꿀이다.

 

 

3. 세번째 Promise all

let firstPromise = new Promise((resolve, reject)=>{
    resolve('first complete')
});

let secondPromise = new Promise((resolve, reject)=>{
    resolve('second complete')
});

let thirdPromise = new Promise((resolve, reject)=>{
    resolve('third complete')
});

Promise.all([firstPromise, secondPromise, thirdPromise]).then((message)=>{
    console.log(message)
});

3개의 Promise 모두 비동기 Call이 모두 끝났을때 then의 함수를 실행시킨다. 이거 진짜 물건이다. 비동기 Call을 하나로 묶어주는 역할!

 

 

4. 네번째 Ajax와 Promise의 만남

    getOnetoFiveRanking = () => {
		return new Promise((resolve, reject)=>{
			$.ajax({
				url: this.url1,
				crossDomain: true,
				data:JSON.stringify(this.form.serialize()),
				dataType: 'json',
				contentType: "application/json",
				headers:{"x-api-key": "비밀"},
				type: 'POST',
			}).done((data)=>{
				resolve(data); // done 시 resolve
			}).fail(function (xhr, textStatus) {
				reject(xhr, textStatus); // ,fail 시 reject
			});
		})
	};
    
    
    this.getOnetoFiveRanking().then((data)=>{
        console.log(data);
    }).catch((xhr, textStatus)=>{
        console.log(xhr, textStatus);
    });
    
    
    

$.ajax의 done일때 resolve, fail일때 reject! 심플하고 좋다.

 

5. 다섯번째 Ajax와 Promise.all()의 만남

    getOnetoFiveRanking = () => {
		return new Promise((resolve, reject)=>{
			$.ajax({
				url: this.url1,
				crossDomain: true,
				data:JSON.stringify(this.form.serialize()),
				dataType: 'json',
				contentType: "application/json",
				headers:{"x-api-key": "비밀"},
				type: 'POST',
			}).done((data)=>{
				resolve(data);
			}).fail(function (xhr, textStatus) {
				reject(xhr, textStatus);
			});
		})
	};


    getSixtoTenRanking = () => {
		return new Promise((resolve, reject)=>{
			$.ajax({
				url: this.url2,
				crossDomain: true,
				data:JSON.stringify(this.form.serialize()),
				dataType: 'json',
				contentType: "application/json",
				headers:{"x-api-key": "비밀2"},
				type: 'POST',
			}).done((data)=>{
				resolve(data);
			}).fail(function (xhr, textStatus) {
				reject(xhr, textStatus);
			});
		})
	};
    
    // getOnetoFiveRanking와 getSixtoTenRanking 비동기 Call이 둘다 끝나면 then 실행!
    Promise.all([this.getOnetoFiveRanking(), this.getSixtoTenRanking()]).then((message)=>{
        console.log(message);
    });

여기서 주의할 점은 메소드를 실행하듯()을 붙여야 한다는것! 그러면 두 메소드가 다 실행되면 그때 then을 수행한다! 이건 정말 실전에서 많이 쓰이니깐 유용함

 

결론 : callback을 깔끔하게 쓰기위해 Promise를 쓰자

'JS' 카테고리의 다른 글

javascript es6 + Promise IE11 간단히 지원  (1) 2021.06.11
javascript 비동기 재귀 함수  (0) 2020.09.28
loading button 쉽게 만들기(with js)  (0) 2019.10.15
js 화살표함수(arrow function)  (0) 2019.10.14
JS prototype(프로토타입)  (0) 2019.09.25

사용자의 Re-Click을 방지하기 위해서 "클릭 했으니깐 기다려주세요!" 라는 메세지를 전달하기 위해서는 loading button이 짱이다.

 

간단하게 loading button을 만드는 css를 적어보자 한다.

 

참조 사이트 : https://loading.io/button/

 

Loading Buttons / Pure CSS Button that Loads

Loading Button with CSS animation for better loading experience with Bootstrap, PureCSS and other frameworks.

loading.io

 

1. loading.css와 loading-btn.css를 다운한다.

2. 버튼을 만든다(클릭 시 버튼 옆에 loading 이미지 생성)

<button id="search">검색
	<span class="ld ld-ring ld-spin-fast"></span>
</button>

3. 버튼 옆에 loading 버튼이 돌아가는것을 확인 후 jquery로 토글한다

class Main {
    constructor() {
        this.setSubmitEvent();
        this.loadingButton = '<span class="ld ld-ring ld-spin-fast"></span>'; // loading 버튼
        this.button = $('#search');
    }

    setButtonDisable = () => {
    	this.button.append(this.loadingButton); // loading 버튼 확성화
    	this.button.attr('disabled', true); // 재 클릭 방지를 위한 button disable
	};

    setButtonEnable= () => {
		$('#search span').remove();
    	this.button.attr('disabled', false);
	};

    setSubmitEvent(){
		$("#search-form").submit((e) => {
			e.preventDefault();

			let form = $("#search-form");

			$.ajax({
				url: '/',
				data: form.serialize(),
				type: 'post',
				dataType: 'json',
				beforeSend: ()=> {
					this.setButtonDisable();
				},
			}).done((data)=>{
				this.setButtonEnable();
				$("#result-table tbody").html(data.html_ranking_list);
			}).fail(function (xhr, textStatus) {
				alert('실패');
			});

			return false;

		});
    }

}

 

결론 : loading 버튼은 필요하지만 매번 만들기 귀찮다 복붙을 잘하자.

'JS' 카테고리의 다른 글

javascript es6 + Promise IE11 간단히 지원  (1) 2021.06.11
javascript 비동기 재귀 함수  (0) 2020.09.28
Promise 자바스크립트(js)  (0) 2019.10.18
js 화살표함수(arrow function)  (0) 2019.10.14
JS prototype(프로토타입)  (0) 2019.09.25


헷갈리는 화살표함수를 정리해보자 한다.

1. 왜생겼을까?
 - 함수를 좀 간결하게 쓰려고(한줄로)
 - javascript OOP 형태로 Class에 넣어서 코딩할때 this의 바인딩 문제를 해결하기 위해


2. 함수를 한줄로의 관점에서


function sum(a, b) { // 익숙한 표준 함수 : 길다 길어..
    return a+ b
}

let arrowSum = (a, b) => { // function 대신에 ()가 들어가서 좀 짧긴하지만 그래도...
    return a + b
};

let oneLineArrowSum = (a, b) => a + b; // { return expression } 을 a + b로 표현했다(간결하다)

function isPositive(number) { // 익숙한 표준 함수 2
    return number >= 0
}

let arrowIsPositive = (number) => number >= 0; // number >= 0 으로 간결하게 표현

let arrowIsPositive2 = number => number >= 0; // 파라미터가 하나 일때는 괄호를 제외할 수 있다

function randomNumber() { // 익숙한 표준 함수 3
    return Math.random()
}

let randomNumber2 = () => Math.random(); // 파라미터가 없을 경우 ()로 시작

document.addEventListener('click', function () { // 익숙한 표준 함수 4
    console.log('Click')
});

document.addEventListener('click', ()=> console.log('Click')); // 한줄로 깔끔하게!

3. this 바인딩 문제의 관점에서


class Person {
    constructor(name) {
        this.name = name
    }

    arrowPrintName() {
        setTimeout(() => {
            console.log(this);
            console.log('Arrow ' + this.name)
        }, 100)
    }

    normalPrintName() {
        setTimeout(function () {
            console.log(this);
            console.log('Function: ' + this.name)
        }, 100)
    }
}

person = new Person('이승우');
person.arrowPrintName() // Person의 this.name이 정상적으로 출력 + this는 Person을 가르킴
person.normalPrintName() // this는 엉뚱한 windows 전역변수를 가르킴(this.name은 당연히 출력 안됨)

 

4. 결론

 - 잘 만쓰면 코드도 깔끔해지고 특히 js에서 OOP로 코딩할때는 필수!

'JS' 카테고리의 다른 글

javascript es6 + Promise IE11 간단히 지원  (1) 2021.06.11
javascript 비동기 재귀 함수  (0) 2020.09.28
Promise 자바스크립트(js)  (0) 2019.10.18
loading button 쉽게 만들기(with js)  (0) 2019.10.15
JS prototype(프로토타입)  (0) 2019.09.25

완벽한 공부법

이번 글에서는 완벽한 공부법 믿음, 메타인지 부분만을 적어보자 한다. 이 책은 내용이 방대할 뿐 아니라 그냥 고개를 끄덕이며 읽어 내려가기엔 깊이가 너무 깊어 챕터마다 내가 느낀점을 적어보자 한다.

 

 

1. 실패 경험이 쌓이고 현재 상황을 변화시킬 수 없다는 경험이 누적될 때마다 무기력은 학습되고 인간의 행동을 지배하게 된다. 그러나 희망적인 것은 비관이 학습되듯 낙관도 학습된다는 것이다

 

  - 내가 규정하는 "패배주의", "루저", "패배자"는 학습된 무기력으로 만들어 지는것 같다. 매사에 긍정적이고 밝은 사람도 자기가 하는 모든일에서 실패하면 학습된 무기력으로 인해 "패배주의"에 빠질수도 있다고 믿는다.

 

요즘 흔히 학습된 무기력에 빠진 사람들은 대학이 모든 것을 결정짓는다고 생각하는 고등학생 시절 내가 원하는 대학에 떨어지고 주위 사람들도 그를 그저그런 사람이라고 규정 짓는 상태에서 이를 만회 하고자 재수나 삼수 최악의 상황은 공무원 시험까지 떨어진 사람들 그들에게서 패배주의 향기가 강하게 난다(공무원 응시생이 많으니 20~30대 중에서도 이런 사람들은 꽤 많을거라 생각한다). 책에도 나와있듯 작은성공, 자기만의 강점주목, 성장형 사고 방식들을 통해서 패배자에서 긍정적 향기를 뿜는 건강한 사람이 되도록 노력했으면 좋겠다.(인생을 너무 편협한 시각으로 보지 않았으면..)

 

 

2. 실패가 거듭되는 공부나 일을 반복적으로 할 때 우리는 기대를 잃어버린다. 그러나 그때마다 내가 왜 이공부를 해야 하는지, 이 일의 진정한 가치가 무엇인지를 찾고 상기할 필요가 있다. 니체는 "살아야 할 이유를 아는 사람은 거의 어떠한 상태에서도 견딜 수 있다"고 말했다.

 

  - 같은 사무실을 쓰는 직원중에 한번씩 "아무 의미없습니다." 라고 농담반 진담반으로 말하는 직원이 있다. 그 당시에는 헛웃음으로 넘겼지만 그 말을 듣고 나서 나도 모르게 왠지 일을 하기 싫었다. 내가 지금 하는 일도 아무 의미 없이 느껴져서. 이럴땐 그냥 힘이 빠진다. 일을 하기 싫어서 위의 글을 읽으니 내가 힘이 빠진 이유를 어렴풋이 알겠다. 내가 하는일이 의미 없이 느껴지니 내가 여기서 뭘하나 싶어서. 그냥 이런 이야기를 들을땐 무시하자. 지금 내가 하는 일이 직접적인 회사 매출로 이루어지진 않지만 직원들이 좀 더 편하게 일할 수 있게 도와주는 시스템을 만들고 IT관련 문제로 곤란한 상황을 겪을때 내가 빠르게 도와줌으로서 회사의 생산성을 향상시키는 중요한 일을 하고 있다. 이러한 의미에서 내가 현재 하는일은 가치있다. 그러니 우울해 하지도 내가 필요없다고 느끼지도 말자. 

 

3. 모두가 대단한 일을 할 수 있지만, 대부분은 시험이 삶의 한계가 되고 한계가 확장되어서 시험이 인생의 목표가 된다. 그러니 반드시 시험을 뛰어 넘으라.

 

  - 그냥 이 문구가 너무좋다. 그리고 시험은 제 평생에서 언제나 저보다 더 거대한 존재였습니다. 이 문구도 참 와닿는다.한국에서 시험으로 힘들어했던 모든 사람들이 이문구를 보면 박수가 나올 것 같다. 시험 그건 그냥 내가 얼마나 알고 있는지 확인하는 척도 일뿐 나에게 어떠한 기능적인 영향도 끼치지 못한다.

 

4. 시력 측정을 할 때 그 기호가 보이는 만큼만 말해야 정확한 시력을 알 수 있듯이, 연습문제도 이렇게 저렇게 고민하면서 풀어 봐야 얼마나 아는지 확인이 되는 것이다. 답을 찾는 것이 중요한 것이 아니라 얼마나 이해했는지 확인하는 것이 연습문제의 가장 주된 목적 중에 하나다.

 

  - 진도를 빨리 빼고싶을때, 어떤 주제에 대해서 빨리 알고 싶을때 연습문제 또는 그 주제에 대한 고민 및 깊은 생각은 필수적으로 해야한다. 어떤것을 학습할때는 연습문제를 느끼면서 고민하고 깊이 생각하면서!

 

5. 몰입은 어떤 상황에서 하게 될까? 주어진 과제가 한 사람이 가진 역량을 최대한 끌어낼 때 몰입을 느낄 확률이 높다.만약 가진 역량에 비해 과제가 쉽다면 우리는 지겨움을 느끼게 되고 너무 어렵다면 불안과 두려움을 느끼게된다.

 

  - 너무 쉽지도, 어렵지도 않은 적당히 어려운 목표를 삼고 그것을 해결할때 몰입을 할 확률이 높아진다. 여기서 중요한 부분은 지금 당장 못할만큼 살짝 어렵지만 노력하면 충분히 할 수있는 목표를 삼자. 너무 쉬운 일은 그냥 시간낭비 + 일 하는 속도를 향상시키는 것 뿐

 

'글적글적' 카테고리의 다른 글

유치원&저학년 용 더하기 빼기 게임(안드로이드)  (0) 2023.02.01
pocu comp3500 짧은 후기  (0) 2021.12.27
빈칸 만들기 어플  (0) 2020.12.07

JS를 쓰면서 항상 헷갈렸던게 프로토타입이다. Class도 없고 Function을 Class처럼 쓰고.. 물론 새로나온 JS는 아니지만 어쨋든 헷갈리면서도 일하는데 불편함이 없어서 그냥 넘어가던걸 한번 정리하고자 한다. 참조한 문서는https://developer.mozilla.org/en-US/docs/Learn/JavaScript/Objects/Object_prototypes이다.

 

JS는 prototype-based라고 한다. prototype은 필요한 메소드, 프로퍼티를 정의해놓고 그것을 상속해주기위한 도구라고 생각한다. 이것을 여러단계로 상속하면 prototype chain이라고 부르는 것 같다. 예제를 보자

 

function Person(name) {
  this.name = name;
  this.greeting = function() {
    alert('Hi! I\'m ' + this.name + '.');
  };
}

 

const person1 = new Person('승우') // function으로 Class를 만들었던 JS는 참 비극이다.

 

이렇게 Object를 만들면 person1이 사용할 수 있는 메소드와 프로퍼티는 name과 greeting이여야 하는데 

person1.valueOf()을하면 먹힌다. Person에는 valueOf이라는게 없는데. 그렇데 프로토타입으로 부터 상속 받은것이다.

 

 

JS의 모든것은 Object이다. function, String, Number등등 그냥 다 Object이다. 그래서 Person function 또한 Object로 부터 상속받는다. 이러한 이유로 person1.valueOf()이 먹힌다는 말씀이시다.

조금만 더 정확히 기술하자면 Object.prototype 의 Object에 기술되어 있다. Object에 관한 문서를 보면 상당히 많은 메소드와 프로퍼티가 있지만 모두다 상속 되지 않는다. Object.prototype에 기술된 것들만 상속된다.

 

이부분을 약간만 응용하자만

 

const myString = 'This is my string.'; // String prototype으로 부터 split(), replace()와 같은 아름다운 메소드들을 상속 받기 때문에 myString.split()을 사용할 수 있다는 말이다.

 

조금 더 응용하자면 Date의 커스텀 prototype을 만들어서 내가 원하는 메소드를 구현하고자 한다.

 

Date.prototype.yyyymmdd = function () {
   var mm = this.getMonth() + 1;
   var dd = this.getDate();
   return [this.getFullYear(), (mm > 9 ? '' : '0') + mm, (dd > 9 ? '' : '0') + dd].join('-');
}; // yyyymmdd 메소드를 프로토타입에 정의한다.

 

var date = new Date();

var plusThreeDate = new Date(date.getTime() + (3 * 24 * 60 * 60 * 1000)); // 3일 뒤 Date 생성

plusThreeDate.yyyymmdd() // "2019-09-28"과 같이 yyyymmdd 메소드를 사용할 수 있다.

 

 

 

 

'JS' 카테고리의 다른 글

javascript es6 + Promise IE11 간단히 지원  (1) 2021.06.11
javascript 비동기 재귀 함수  (0) 2020.09.28
Promise 자바스크립트(js)  (0) 2019.10.18
loading button 쉽게 만들기(with js)  (0) 2019.10.15
js 화살표함수(arrow function)  (0) 2019.10.14

엑셀파일

위와같은 엑셀파일을 Django ORM을 이용해서 insert 하고자한다.

 

소스코드


import openpyxl
import os
import django
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "subul.settings")
django.setup()

from order.models import Order
from core.models import Location
from product.models import ProductCode

import django
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "subul.settings")
django.setup()

 

위의 3코드는 Django의 설정파일을 set해주고 django.setup()으로 django를 실행한다고 생각하면 편하겠다

 


wb = openpyxl.load_workbook('productOrder.xlsx') # productOrder.xlsx 파일을 열어서 wb 변수에 할당
sheet1 = wb['Sheet1'] # 엑셀의 Sheet1을 open
rows = sheet1['A3':'L310'] # sheet1의 A3부터 L310까지 rows 변수에 할당

for row in rows:

    # rows는 여러줄이니 row는 한줄

    # row[0]은 가로 한줄의 제일 첫번째 세로칸 즉 A3,B3.... L3


     dict = {}
     dict['id'] = row[0].value
     dict['type'] = row[1].value
     dict['specialTag'] = row[2].value
     dict['ymd'] = row[3].value
     dict['orderLocationName'] = row[5].value
     dict['codeName'] = row[6].value
     dict['amount'] = row[7].value
     dict['count'] = row[8].value
     dict['price'] = row[10].value
     dict['memo'] = row[11].value

     product_Instance = ProductCode.objects.get(codeName=dict['codeName'])
     toLocation_instance = Location.objects.filter(codeName=dict['orderLocationName']).filter(type='05').first()
     dict['code'] = product_Instance.code
     dict['productCode'] = product_Instance
     dict['orderLocationCode'] = toLocation_instance
     Order(**dict).save() # 킬링포인트 **딕셔너리를 활용해서 쉽게 insert


'python' 카테고리의 다른 글

파이썬 데코레이터 활용(로깅)  (1) 2021.09.02
python oracle 데이터 json serialize(django)  (0) 2020.02.25
python super  (0) 2019.12.26
python 메모리 관리(memory allocation)  (4) 2019.11.15
클래스 관계 IS-A 상속  (0) 2019.11.07

0과 1밖에 모르는 컴퓨터에 문자를 인식 시키려면 어떻게 해야할까?

 

문자를 0과 1로 이루어진 2진수로 나타내면 된다. 문자 하나에 정수 하나를 매핑해 두면 이 정수는 특정 문자를 표현한다는 것 을 알수있다. 이렇게 매핑된 정수를 코드 포인트라고 하며 문자와 문자에 매핑된 코드 포인트를 모아 놓은 집합을 부호화된 문자 집합이라고 한다. 

 

역시 무슨말인지 하나도 모르겠다.

 

아스키 코드, 유니코드

 

 - 아메리칸인들을 위한 대표적인 문자 인코딩 방식이다. 비트 일곱개로 문자를 표현하고 문자를 총 128개 까지 표현할 수 있다. 그말은 코드 포인트도 128개란 말이다.(0000000 ~ 1111111)

정수하나에 문자를 매핑시킨다, 코드 포인트는 아래의 표를 보면 정확히 알 수 있다

110 0001의 정수(2진수로)를 아스키코드 문자로 나타낸다면(매핑) a인것이다

110 0001을 코드 포인트라고 부른다.

파이썬으로 나타낸 아스키코드

 

아스키코드 표

 

다시 아스키코드로 돌아가서 아스키코드는 한글을 표현할 수 없다 왜냐하면 아스키코드를 만든 제작자가 아주 이기적이기 때문에 숫자와 영어만을 고려해서 만든것이다. 그래서 나온게 바로 유니코드이다. 유니코드는 7비트만을 이용해서 문자 집합을 표현하는 아스키와 달리 16비트로 확장해서 65,536개의 문자를 표현할 수 있게 확장한 버전인것이다.

이로서 한글을 나타낼 수 있게되었다! 

 

유니코드는 위와 위사한 표를 제공하는데 한글은 16비트로 AC00 ~ D7AF까지 자리 잡고있다

AC00은 '가'를 나타내는 16진수 코드포인트이다.

파이썬에서 AC00을 쳤을때 '가' 출력

자 이제 문자와 코드포인트의 관계를 매핑하는 표에 대해서도 알아봤다. 하지만 진짜 중요한건 인코딩이다

 

유니코드 인코드 방식

 - 코드 유닛코드포인트를 특정한 방법으로 인코딩했을때 변환되어 얻어지는 비트의 나열이다.

이말은 무엇이냐 UTF-8로 인코딩을 하면 코드 유닛은 UTF-8의 알고리즘에 의해 인코딩 된 코드 유닛을 뱉고 UTF-16으로 인코딩하면 UTF-16의 알고리즘에 의해 인코딩 된 코드 유닛을 뱉는다는 말이다

인코딩 방식에 따라 코드 유닛이 상이함

 

문자 '가'를 가지고 어떤것으로 인코딩 하냐에따라 결과물(코드 유닛)이 달라진다.

 

이제 이 코드 유닛을 어디에 쓰는가? 이것만 확인하면 정말 핵심은 끝이다.

  ※ UTF-8 , UTF-16의 변환법은 각각 다르고 어려우니 PASS

UTF-8 표

 

'가'만 보자 제일 왼쪽에 UTF8: 234, 176, 128이라고 나오고 그다음으로 UNICODE: AC0이라고 나오는 것을 볼 수 있다.

위의 '가'를 UTF-8으로 인코딩하면 0xea 0xb0 0x80이라는 16진수가 튀어나온다.

이를 다시 정수로 변환하면 234, 176, 128이 나온다 그렇다 UTF-8표에 나오는 바로 그 숫자이다.

UTF-8표에 매핑하는 방법

이런식으로 인코딩을 해서 나오는 값(코드 유닛)을 UTF-8표에 매핑시켜서 출력 시켜주는 것이다.

 

끄읏!!

+ Recent posts