이 블로그 검색

2018년 1월 27일 토요일

vim + 정규식을 이용한 smi 파일 일괄 수정

주말이라서 영화를 받았는데,smi 파일은 있는데 자막이 안나온다. 좋아하는 영환데...
smi 파일을 열어보니, 뭔가 알수 없는 규칙으로 작성되있다.

<SYNC Start=55046>알아, 궁금하겠지                                                             
<SYNC Start=56681>&nbsp;                                                                                     
<SYNC Start=56748>'천하의 토르가<br>                                                                         
어쩌다 이 꼴이 됐을까?'                                                                                                     
<SYNC Start=60318>&nbsp;                                                                                     
<SYNC Start=60485>때론 잡혀야만<br>                                                                          
원하는 걸 알아낼 수 있거든                               

자막파일은 있는데 왜 안나올까 궁금하여 잠시 알아보니 한국 자막인 경우엔 다음처럼 되어야 한다고 한다..


<SYNC Start=55046> <P Class=KRCC>알아, 궁금하겠지                                                             
<SYNC Start=56681> <P Class=KRCC>&nbsp;                                                                                     
<SYNC Start=56748> <P Class=KRCC>'천하의 토르가<br>                                                                         
어쩌다 이 꼴이 됐을까?'                                                                                                     
<SYNC Start=60318> <P Class=KRCC>&nbsp;                                                                                     
<SYNC Start=60485> <P Class=KRCC>때론 잡혀야만<br>                                                                          
원하는 걸 알아낼 수 있거든                               

<P Class=KRCC> 가 있어야 한국어 자막으로 인식된다고.
자막 생성자가 뭔가 잘못 올린듯.. 시험삼아 고쳐보니, 제대로 자막이 출력된다.
전체 자막을 수정하기 위해 vim으로 열어서  다음을 실행했다.

:%s/<SYNC Start=[0-9]*>/\0 <P Class=KRCC>/g

replace 명령을 수행할때 정규표현식을 사용하여, 먼저 <SYNC Start=숫자> 포맷을 찾고, 그 전체 문자열(\0) 에다가 <P Class=KRCC>를 덧붙인것이다.

참고 : http://vim.wikia.com/wiki/Search_and_replace#Details

2018년 1월 10일 수요일

libcurl POST 한글 encoding

curl 프로그램을 사용하여 POST 전송 시, 한글 데이터를 endcoding 해서 전송하는 방법은 다음과 같다.

curl -d "NAME1=test data" --data-urlencode "NAME2=한글데이터"  http://xxx.yyy.zzz

-d 옵션으로 여러번 지정을 해도 curl이 merge해줘서 전달되는 데이터는 "NAME1=test data&NAME2=한글데이터" 이 된다. URL-encoding 이 필요한 값은 -d 대신 --data-urlencode  로 지정 해 준다.

한편 c++ 에서 libcurl을 사용하여 동일한 작업을 수행하려면 다음처럼 하면 된다.

curl_easy_setopt(curl, CURLOPT_URL, "http://postit.example.com/moo.cgi");

//encoding할 한글데이터만 분리해서 처리 후
char temp_buffer[1024];
int len=snprintf(temp_buffer, sizeof(temp_buffer),"%s","한글데이터");
char* encoded = curl_easy_escape(curl, temp_buffer, len);

//하나의 문자열로 조합해야한다.
char post_field [1024];
snprintf(post_field, sizeof(post_field),"%s&NAME2=%s","NAME1=test data", encoded);
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, encoded);

curl_easy_perform(curl);
curl_free(encoded);

curl 프로그램으로 전송할때와 달리 libcurl 사용 시에는 CURLOPT_POSTFIELDS 를 한번만 사용해야 한다. 이를 위해서는 encoding될 한글 데이터만을 별도로 분리하여 curl_easy_escape 함수를 호출해야 한다. 즉 아래처럼 사용하는 경우에는 에러가 발생된다.


//error 발생!
char temp_buffer[1024];
int len=snprintf(temp_buffer, sizeof(temp_buffer),"%s","NAME1=test data&NAME2=한글데이터");
char* encoded = curl_easy_escape(curl, temp_buffer, len);
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, encoded);

이 경우에는 데이터가 모두 encoding 되면서 '=' 문자도 함께 되버리기 때문에, 받는 쪽에서 에러를 뱉게 된다.
curl_easy_escape 함수 문서를 보면 다음과 같이 설명되어 있다.
All input characters that are not a-z, A-Z, 0-9, '-', '.', '_' or '~' are converted to their "URL escaped" version (%NN where NN is a two-digit hexadecimal number).

처음에 나온 curl 프로그램을 사용하는 경우에는
curl -d "NAME1=test data" --data-urlencode "NAME2=한글데이터"  http://xxx.yyy.zzz
--data-urlencode "NAME2=한글데이터" 이 부분에서 curl 이 "=" 이후 부분만 알아서 인코딩 해주기 때문에 수신 측에서도 문제가 없다. 하지만 libcurl 은 이런식으로 동작하지 않으므로 주의가 필요할듯.