Prompt

- 판타지 소설 작가

- 한국

- 드라마

- 판타지 드라마

- 주제 : 세종대왕이 아이패드를 사용했다면

- 세종대왕만 소유

- 한글 창제에 기여한 내용 위주

- 주변 인물 제외

- 우여곡절 자세히

- 아이패드 사용방법 강조

 

Content

[제목]

세종의 한글 혁명: 아이패드로 만든 창제기

 

[시노돕스]
"세종, 아이패드, 그리고 한글 창제"

이 작품은 세종대왕이 21세기의 기술을 이용해 한글 문자를 창제하며, 다양한 분야에서 기술 혁신을 일으켰던 이야기를 다루고 있다. 세종대왕은 아이패드를 이용해 새로운 한글 문자를 창제하고, 이를 통해 조선의 발전을 이끌어냈다. 그러나 그는 아이패드를 사용하는 과정에서 여러 어려움을 겪게 되었고, 이를 극복하기 위해 노력하며, 자신의 발견과 경험을 나눔으로써 다른 사람들도 아이패드 사용을 더욱 효과적으로 배울 수 있게 했다.

이 작품은 기술 혁신과 열정의 중요성을 강조하며, 세종대왕의 노력과 열정을 통해 기술 혁신이 어떻게 발전하고 성취될 수 있는지를 보여준다. 또한, 시대와 기술이 달라져도, 열정과 노력을 가지고 문제를 극복하며 발전을 이끌어내는 것의 중요성을 상기시켜 준다.

이 작품은 기술 혁신과 열정의 중요성을 강조하는 동시에, 세종대왕의 업적을 새롭고 흥미로운 시각으로 재해석해 시청자들에게 새로운 인사이트를 제공한다.

[인물 설정]

세종대왕: 이 작품의 중심 인물로, 조선의 제4대 군주이며, 아이패드를 가지고 있다. 세종대왕은 아이패드를 이용해 조선의 문화, 경제, 정치, 군사 등 모든 분야에서 혁신을 일으키며, 이를 통해 조선의 발전을 이끌어낸다.


[드라마 흐름]

세종대왕은 아이패드를 통해 새로운 한글 문자를 창제하고, 이를 통해 조선의 문화, 경제, 정치, 군사 등 모든 분야에서 혁신을 이끌어내기 시작한다. 그러나 아이패드 컴퓨터를 사용하는 도중, 다양한 우여곡절에 직면하게 된다.

세종대왕은 아이패드를 사용하는 방법을 배우는 데 많은 시간과 노력을 투자한다. 그는 컴퓨터에 대한 지식이 거의 없어서 아이패드를 사용하는 방법을 스스로 익혀야 했다. 그래서 그는 일주일간 책을 통해 아이패드를 배우는데 노력했다. 또한, 그는 아이패드 사용에 필요한 기술적인 지식을 습득하는 과정에서 몇 번의 실패와 투자한 노력에 비해 성과가 미미한 순간들을 겪게 된다.

하지만, 세종대왕은 절망하지 않고 매 순간, 자신이 배운 내용을 바탕으로 아이패드를 더 잘 다룰 수 있도록 노력했다. 또한, 자신의 발견과 경험을 다른 사람들과 나눔으로써, 아이패드 사용법을 더욱 효과적으로 습득할 수 있었다.

[메시지]

이 드라마는 기술 혁신과 열정의 중요성을 강조한다. 세종대왕은 아이패드를 이용해 새로운 한글 문자를 창제하고, 이를 통해 조선의 발전을 이끌어냈다. 그러나 그는 아이패드를 사용하는 과정에서 여러 어려움을 겪게 되었다. 그러나 세종대왕은 어려움을 극복하며 아이패드를 잘 다룰 수 있도록 노력했다. 그리고 그는 자신의 발견과 경험을 나누어 다른 사람들이 아이패드 사용을 더욱 효과적으로 배울 수 있게 했다.

이 드라마는 또한 기술 혁신의 중요성을 강조한다. 세종대왕은 아이패드를 사용하면서, 아이패드를 이용해 다양한 분야에서 혁신을 일으켰다. 그리고 그의 노력과 열정은 조선의 발전에 큰 기여를 하게 되었다. 이를 통해 시청자들은 기술 혁신의 중요성을 깨닫게 되고, 열정과 끈기를 가지고 문제를 극복해나가는 것의 중요성을 배울 수 있다.

[드라마 요약]

이 드라마는 세종대왕이 아이패드를 이용해 한글 문자를 창제하며, 다양한 분야에서 기술 혁신을 이끌어냄으로써 조선의 발전에 큰 기여를 한 이야기를 다룬다. 그러나 그는 아이패드를 사용하는 과정에서 많은 어려움을 겪게 되며, 이를 극복하기 위해 노력하고, 자신의 경험을 나눔으로써 다른 사람들도 아이패드 사용을 더욱 효과적으로 배울 수 있게 했다. 이 드라마는 기술 혁신과 열정의 중요성을 강조하며, 시청자들에게 노력과 열정이 어려움을 극복하며 발전을 이끌어내는데 중요한 역할을 한다는 것을 알리고 있다.

http://gyuha.tistory.com/439


http://blog.naver.com/PostView.nhn?blogId=acl58&logNo=40135813736

[출처 : http://cboard.cprogramming.com/c-programming/109648-fwrite-fread-question.html]

회사 동료가 찾아준 링크에서

bigendian을 littleendian로 바꿨다.


그리고 fwrite랑 동일하게 작동하려면,

else 부분에서 반환되는 값을 size로 나눠야 한다.


static size_t littleendian_fwrite(const void* data, size_t size, size_t count, FILE* stream)

{

uint32_t i = 1;

const char* c = (char*)&i;

int32_t written = 0;

if (!(*c == 0))

return fwrite(data, size, count, stream);

else

{

c=data-1;

while(count-- > 0)

{

c+=size;

for(i=0;i<size;i++)

written+=fwrite(c--,1,1,stream);

}

return written/size;

}

}



[출처 : http://geundi.tistory.com/113]



grep, egrep, fgrep

1. 기능


파일에서 특정한 패턴(문자열)을 찾는 명령어이다. 이는 해당 문자열이 들어있는 파일을 찾아 그 문자열이 들어가 있는 라인(행)을 화면에 출력한다.

아래에 언급하는 메타문자를 활용하여 더욱 강력한 기능으로써 그 역할을 수행해낸다


2. 사용법

  (1)grep [옵션] [정규표현식(문자열)] [찾기 대상이 될 파일명]

-입력으로 파일명이 오지 않으면 표준입력으로부터 입력을 받는다

  (2)grep 패턴 *

-현재 디렉토리에서 해당 문자열이 들어있는 파일을 찾아서 그 문자열이 들어가 있는 라인(행)을 화면에 출력한다.(서브디렉토리까지 검색하기 위해서는 아래 옵션에 언급하는 바와 같이 -r옵션을 주어야 한다)

-grep 패턴 a* : a로 시작하는 모든 파일에서 해당 문자열이 들어있는 라인을 출력한다.

-이와 같이 간단하게 이용할 수도 있다.


3. 옵션

-옵션은 대소문자를 구분한다.

-c, --count : 파일의 내용 대신 문자열이 들어있는 라인의 수를 출력(3개의 라인에서 매칭된다면 3출력)

-n, --line-number : 문자열이 들어있는 라인과 문두에 라인번호를 출력

-i, --ignore-case : 문자열의 대소문자 구분하지 않음

-l(소문자 L), --files-with-matches : 문자열 을 포함하는 파일의 이름만 출력

-r, --recursive  : 서브 디렉토리의 파일까지 모두 출력

-v, --invert-match : 문자열이 제외된, 즉 문자열이 포함되어 있지 않은 라인을 출력

-e PATTERN, --regexp=PATTERN : pattern 에서 찾을 문자열 명시, 패턴으로 PATTERN을 사용("-으로 시작하는 패턴"을 보호하는데 유용)


-w, --word-regexp : pattern 이 전체 단어와 일치하는 줄만 출력, 단어의 일부로써 일치하는 경우가 아닌, 하나의 단어로써 일치하는 줄이 출력.

-x, --line-regexp : pattern 이 전체 줄과 일치하는 줄만 출력

-a, --text  : 기본적으로 grep는 바이너리 파일을 처리할 수없다. 그런데 바이너리파일을 텍스트파일처럼 처리할 수있는 옵션이 -a 옵션이다

-A NUM, --after-context=NUM : 패턴매칭라인 이후의 라인을 NUM수만큼 출력

-B NUM, --before-context=NUM : 패턴매칭라인 이전의 내용을 NUM수만큼 출력.

-C NUM, -NUM, --context=NUM : 출력물 앞뒤 전후의 주어진 라인만큼 출력(패턴매칭 라인은 포함하지 않고 기본 2라인)

-b, --byte-offset : 패턴매칭되기전 라인의 바이트수를 출력

--binary-files=TYPE : 
파일 헤더가 바이너리를 포함한 파일을 가리키면 TYPE형 파일이라고 인식한다.
기본은 binary이다.
grep는 일반적으로 바이너리 파일을 알 수있는 하나의 메시지를 출력하거나 매치되지 않으면 메세지를 출력하지 않는다.
TYPE이 without-match 이면 grep는 바이너리파일이 매치되지 않는걸로 생각한다.
이는 -I(대문자 I) 옵션과 동등하다.
만약 TYPE이 text이면 grep은 텍스트파일로써 바이너리를 처리한다.
이는 -a 옵션과 동등하다. 

-d ACTION, --directories=ACTION :
입력파일이 디렉토리이면 ACTION 처리한다. 
기본적으로 ACTION은 read이고, 이는 원본파일인것처럼 디렉토리가 읽는다는것을 의미한다. ACTION이 skip이면 skip된다. ACTION이 recurse이면 grep은 각각의 디렉토리이하를 순환적으로 읽어들인다.
이는 -r 옵션과 동등하다.


(이하 옵션 다음 신지식 참고 : grep 사용법)
-E, --extended-regexp : 확장 정규표현식으로 패턴을 해석한다(=egrep 같은 의미)

-F, --fixed-strings : newline으로 분리된 고정된 문자열의 리스트로써 패턴을 해석한다(=fgrep과 같은 의미)

-f FILE, --file=FILE : 파일로부터 패턴을 얻는다(파일의 라인마다). 공백파일은 zero 패턴을 포함한다. 그러므로 매치되는것이 없다.

-G, --basic-regexp : 정규표현식으로써 PATTERN을 해석하고 이것이 기본이다

-H, --with-filename : 매칭되는 파일명을 출력

-h, --no-filename :여러개의 파일이 검색되었을때 -H 옵션처럼 앞에 파일명을 출력하지 않는다

--help : help 메세지를 출력

-I(대문자 i) : 매칭된 데이터를 포함하지 않는것처럼 바이너리 파일을 처리한다. binary-files=without-match 옵션과 동등하다

-i, --ignore-case : 주어진 패턴이나 입력파일에서 대소문자를 무시한다.

-L, --files-without-match : 일반적으로 출력되는 출력을 스킵하고 각각의 입력파일을 출력한다. 처음으로 매칭되는 파일이 나타나면 중지된다

-l, --files-with-matches : -L 과 반대 

--mmap :
가능하면 read 시스템콜대신 입력을 읽어들이는 mmap 시스템콜을 사용한다.
이 경우, 보다나은 퍼포먼스를 유지하지만 또한, grep 작동중 입력파일이 줄어든다거나 I/O 에러가 발생하면 비정상적인 동작을 야기시키기도 한다

-q, --quiet, --silent : 출력을 억제한다. 처음으로 매칭되는것이 발견되면 중지한다. -s, --no-messages 옵션 참조

-r, --recursive : 하위 디렉토리를 순환적으로 모두 읽는다. -d recurse 옵션과 동등하다

-s, --no-messages : 
존재하지 않거나 읽기불가능한 파일에대한 에러메세지을 출력하지 않는다.
GNU grep과는 다르게 정통 grep은 POSIX.2 규격에 부합하지 않는다. 때문에 정통 grep은 -q 옵션이나 GNU -q 옵션같은 -s 옵션의 역할이 미미하다.
쉘스크립트에선 이식성을 위해 정통 grep에서 -q, -s 옵션을 억제하거나 /dev/null로 리다이렉트 시킨다


-U, --binary :
바이너리 파일로 취급한다.
MS-DOS나 MS-Windows에서는 grep은 기본적으로 파일의 첫 32KB의 내용을 보고 파일타입을 예측한다.
만약 grep이 텍스트파일로 인식하면 (정확한 정규표현 작업을 위해서) 원본파일로부터 CR 문자를 없앤다.
-U 옵션에 쓰이는건 모든 파일이 읽혀지고 매칭절차를 지나쳐야 하기때문이다.
각 라인의 끝에 CR/LF 가 포함된 텍스트파일이라면 정규표현식 처리에 원하지 않는 결과가 발생할 것이다. 이 옵션은 MS-DOS, MS-Windows와 다른 플랫폼에서는 작동하지 않는다.

-u, --unix-byte-offsets :
유닉스 스타일의 바이트출력한다.
이런 변환이 있기때문에 grep이 유닉스 스타일의 텍스트파일처럼 읽기가 가능해진다.
이것은 유닉스머신에서의 grep처럼 정확한 결과를 산출할 것이다.
이 옵션은 -b 옵션이 쓰이지 않으면 소용이 없다.
MS-DOS, MS-Windows와 다른 플랫폼에서는 작동하지 않는다.  

-V, --version : 표준에러로 grep의 버전을 출력한다. 

-w, --word-regexp :
문자열이 하나의 단어인 경우에만 검색, 즉 전체 단어유형 매칭을 포함하는 라인만 선택한다.
이 테스트는 매칭되는 문자열이 라인의 처음에 위치하거나 non-word에 의해 선두에 와야한다. 마찬가지로, 문미에 오거나 non-word가 마지막에 와야 한다.
word-constituent 는 문자,숫자,밑줄이 될 수있다. 

-Z, --null : 
파일명 대신 0 byte 문자를 출력한다.
예를들면, grep -IZ 는 유용한 newline 문자대신 각 파일명뒤에 0byte를 출력한다.
이 옵션은 newline과 같은 유용한 캐릭터를 포함하는 파일명까지도 출력을 명쾌하게 해준다. 이 옵션은 임의의 파일명을 처리하는 find -print0, perl -0, sort -z, xargs -0과 같은 명령어와 함께 사용될 수있고 newline 캐릭터를 포함하는 그 자체로도 사용할 수있다.


3. grep에서 사용하는 정규표현식 메타문자
메타문자
기    능
사용 예
사용 예 설명
^
행의 시작 지시자
'^love'
love로 시작하는 모든 행과 대응
$
행의 끝 지시자
'love$'
love로 끝나는 모든 행과 대응
.
하나의 문자와 대응
'l..e'
l 다음에 두 글자가 나오고 e로 끝나는 문자열을 포함하는 행과 대응
*
선행문자와 같은 문자의 0개 혹은 임의개수와 대응
*love'
0개 혹은 임의 개수의 공백 문자 후에 love로 끝나는 문자열을 포함한 행과 대응(*앞에 공백이 있는 상태, 다른 문자가 있다면 그 문자가 0개 혹은 임의 개수의 문자 후에 love로 끝나느 경우를 말함)
[]
[] 사이의 문자 집합중 하나와 대응
'[Ll]ove'
love나 Love를 포함하는 행과 대응
[^ ]
문자집합에 속하지 않는 한 문자와 대응
'[^A-K]love'
A와 K 사이의 범위에 포함되지 않는 한 문자와 ove가 붙어있는 문자열과 대응
\<
단어의 시작 지시자
'\<love'
love로 시작하는 단어를 포함하는 행과 대응(vi,grep에서 지원)
\>
단어의 끝 지시자
'love\>'
love로 끝나는 단어를 포함하는 행과 대응
(vi,grep에서 지원)
\(..\)
다음 사용을 위해 태그를 붙인다.
'\(lov\)ing'
지정된 부분을 태크1에 저장한다. 나중에 태그값을 참고하려면 \1을 쓴다. 맨 왼쪽부터 시작해 태그를 9개가지 쓸 수 있다. 왼쪽 예에서는 lov가 레지스터1에 저장되고 나중에 \1로 참고할 수 있다.
x\{m\}
문자 x를 m번 반복한다.
'o\{5\}'
문자 o가 5회 연속적으로 나오는 모든 행과 대응
x\{m,\}
적어도 m번 반복한다.
'o\{5,\}'
문자 o가 최소한 5회 반복되는 모든 행과 대응
x\{m,n\}
m회 이상 n회 이하 반복한다.
o\{5,10\}'
문자 o가 5회에서 10회 사이의 횟수로 연속적으로 나타나는 문자열과 대응
(표참조 : http://www.leopit.com/Leophp/board/lecture_board/view.php?id=61&board_mode=linux)


4. egrep

egrep은 grep의 확장판으로서 grep가 하나의 문자열을  찾는 것 과는 달리, 여러개의 문자열을 동시에 찾을 수 있고, grep에서 활용할 수 있는 메타문자 이외에 추가 정규표현식 메타문자를 지원한다.

  (1)egrep에서 사용하는 정규표현식 메타문자

+  : + 앞의 정규표현식이 1회 이상 나타남 
: ? 앞의 정규표현식이 0 또는 1회 나타남
|  : 문자열간의 OR연산자
() : 정규 표현식을 둘러 쌈


  (2)egrep 예제

 egrep 'NW|EA' datafile : (NW나 EA가 포함된 행을 출력한다. NW와 EA사이에 파이프( | ))
 egrep '3+' datafile : (숫자 3이 한 번 이상 등장하는 행을 출력한다.)
 egrep '2.?[0-9]' datafile : (숫자 2 다음에 마침표가 없거나 한 번 나오고, 다시 숫자가 오는 행을 출력한다.)
 egrep ' (no)+' datafile : (패턴 no가 한 번 이상 연속해서 나오는 행을 출력한다.)
 egrep 'S(h|u)' datafile : (문자 S 다음에 h나 u가 나오는 행을 출력한다.)
 egrep 'Sh|u' datafile  : (패턴 Sh나 u를 포함한 행을 출력한다.) 


5. fgrep

fgrep 문자열로만 검색을 한다. 문자열 부분에 위치한 모든 문자를 "문자로써"취급한다. 즉, 정규표현식의 메타문자도 일반문자로 취급한다. fgrep은 문자열로만 검색하기 때문에 검색속도가 빠르다는 장점이 있다.


6. 참고
  (1)정규 표현식에서 메타문자(& ! . * ? $ 및 \) 앞에 백슬래시(\)를 나타내면 grep으로 하여금 그것의 특수 의미를 무시하도록 한다.
  ex) grep ^\.      // 마침표로 시작되는 줄을 찾음 
        grep '\$'     // "$" 문자가 포함된 줄을 찾음 

  (2)패턴을 작성할 때 \(역슬래쉬)가 들어가는 경우(\<, \(..\), x\{m\} 이러한 표현식 등)나, 특수문자를 문자자체로 인식하게 하려 \을 사용하는 경우, 패턴에 있어서 파이프( | )를 이용하는 경우에는 패턴을 따옴표(") 작은 따옴표(')로 감싸주어야 한다. 
[출처 : http://blog.naver.com/nlp1/150079485722]


 한글

 구분  시작  끝
 한글(자음, 모음)  1100  11FF
 호환용 한글(자음, 모음)  3131  318F
 한글 음절(가~힣)  AC00  D7A3

 

한자

 구분  시작  끝
 한중일 부수 보충  2E80  2EFF
 한중일 통합 한자 확장 - A  3400  4DBF
 한중일 통합 한자  4E00  9FBF
 한중일 호환용 한자  F900  FAFF
 한중일 통합 한자 확장  20000  2A6DF
 한중일 호환용 한자 보충  2F800  2FA1F

 

일어

 구분  시작  끝
 하라가나  3040  309F
 가타카나  30A0  30FF
 가타카나 음성 확장  31F0  31FF
[출처 : http://bbs.python.or.kr/viewtopic.php?p=66561&sid=d7caa9e552c40cae5c64bd0169a5d73a]

>>> a = "\uc5ec\ub7ec" 
>>> a.decode('unicode-escape') 
u'\uc5ec\ub7ec' 
>>> print a.decode('unicode-escape') 
여러 



>>> import re 
>>> re.sub(r'\\u(\w+)', lambda m: unichr(int(m.group(1), 16)), a) 
u'\uc5ec\ub7ec' 
>>> print _ 
여러  
[출처 : http://lumitech.tistory.com/entry/Python-String-Unicode-translate-function]


문자(열) 교체 함수 str.translate(), unicode.translate() 사용법

우선 일반 문자열(unicode object 아닌 문자열)부터.

str.translate(tbl,del)두개의 인자를 받는다. tbl은 0~255의 ASCII문자를 각각 대체할 문자로 만든 매핑테이블이다. 말이 테이블이지 길이 256짜리 문자열이다. 즉, ASCII코드 32인 문자(스페이스)는 매핑테이블의 32번째 글자로 바꿔주는 것이다. 따라서 tbl은 꼭 길이 256인 문자열(str object)여야 한다.

string.translate(s, tbl, del) == s.translate(tbl, del) 이다.

 

바로 예제 ㄱㄱㅅ

 

  1. #원본 문자열. \n는 개행, \t는 탭문자, \b는 앞글자를 지운다.
    tstr = """가나다\n\t\b123 4\b5\b6\babcd efgh (789) -_-+ 라마바 사2사2 文字"""

    # 원본 문자열을 프린트
    print "original:", tstr

    # 간단한 translate. 각 바이트의 첫 비트로 translate
    tbl = ""
    for cc in range(256):
       if cc < 128: tbl += "0"
       else: tbl += "1"
    print "tbl =", tbl
    print "initial bit:", tstr.translate(tbl)

 

컨트롤 캐릭터를 지우는데 활용해 보기.

 

  1. # ascii code값이 32미만(컨트롤캐릭터)이면 32(space)로 바꾸는 매핑테이블. \n \r \t \b 이런거 다 공백으로 바뀐다.
    TRMAP_ASCII_CTRL2SPACE = "".join([chr(max(32,cc)) for cc in range(256)])
    print "ctrl to space:", tstr.translate(TRMAP_ASCII_CTRL2SPACE)

    # 컨트롤 캐릭터를 공백으로 바꾸고 홀수는 지우는 변환.
    print "ctrl to space deleting '13579':", tstr.translate(TRMAP_ASCII_CTRL2SPACE, "13579")

 

컨트롤 캐릭터를 공백으로 바꾸지 않고 del인자를 써서 삭제할 수도 있다.

  1. # 아무것도 바꾸지 않는 매핑 테이블
    TRMAP_NOCHANGE = "".join([chr(cc) for cc in range(256)])

    # 컨트롤 캐릭터만 삭제
    ASCII_CTRLCHARS = "".join([chr(cc) for cc in range(32)])
    print "delete ctrl chars:", tstr.translate(TRMAP_NOCHANGE, ASCII_CTRLCHARS)

 

character code가 127이하인 문자를 삭제하는 del인자를 써서 한글, 한자, 일어 등 멀티바이트문자만 남길 수도 있다. 간단하므로 예제 코드 생략.

 

다음은 unicode.translate()

이건 사용법은 비슷하지만 두가지 차이점이 있다. 첫째, 매핑 테이블은 진짜-_-테이블이라는것. 둘째, del 인자를 주지 않는다는 것.

매핑테이블은 dict로 정의한다. 그래서 메모리를 크게 잡아먹을 수도 있다. 그래도 함수 수행자체는 뎁따 빠르므로 활용가치가 높다.

매핑 테이블을 만드는 유용한 함수를 하나 같이 소개한다.

__builtins__.zip(seq1, seq2, ... ) 함수는 리스트를 반환하는데, seq1, seq2, ... 에서 순서대로 하나씩 꺼내서 tuple로 묶은 리스트를 반환한다.

즉, zip([1,2,3], ('a', 'b', 'c')) 는 [(1,'a'), (2,'b'), (3,'c')] 를 리턴한다.

dict object는 zip의 결과를 초기화 인수로 받을 수 있도록 만들어져 있으므로, 이걸 활용하면 unicode translate 맵핑테이블을 쉽게 작성할 수 있다.

 

한글이 나타나는 unicode range가 정해져 있으므로, 한글을 공백으로 바꿔버리는 예제를 만들어 보자.

  1. # 위에서 사용한 테스트 문자열을 unicode로 바꾼다.
    utstr = unicode(tstr, "utf8")

    # unicode에서 한글이 나타나는 영역이다.
    __unicode_range_hangul = range(0xac00, 0xd7a4)
    __unicode_range_hangul_jamo1 = range(0x1100, 0x11fa)
    __unicode_range_hangul_jamo2 = range(0x3131, 0x318f)
    __unicode_range_korean = __unicode_range_hangul + __unicode_range_hangul_jamo1 + __unicode_range_hangul_jamo2

    __build_mapping_range2char = lambda r,uc: zip(r, uc * len(r)) 

    # 한글을 모두 공백으로 바꿔버리는 매핑테이블
    trmap_korean = dict(__build_mapping_range2char(__unicode_range_korean, u" "))

    print "utstr:", utstr
    print "utstr without Korean chars:", utstr.translate(trmap_korean)

 

삭제를 하려면 매핑 테이블에서 빈 문자열( u"" )을 주면 된다. __build_mapping_range2char() 람다함수를 조금 고치면 된다. 예제 생략.

[출처 : http://mygony.com/archives/1110]


utf-8 한글을 자르기 위한 함수입니다. javascript 처럼 멀티바이트 글자에 대해 1문자로 취급할 수도 있도록 했습니다. 원래대로라면 utf-8 으로 된 한글은 3byte 이지만, 익숙한 계산법을 따르기 위해서 이 함수에서는 2byte인 것처럼 취급합니다. 즉, 다음과 같습니다.

원본
한글과 English를 혼용해서 씁니다.
checkmb=true, len=10
한글과 Eng (한글=2*3 + 공백=1*1 + 영문=1*1 => 10)

checkmb=false, len=10
한글과 Englis (모두 합쳐 10자)

 $a = '한글hangul도 포함include되었습니다.';

 
/**
* cut string in utf-8
* @author gony (http://mygony.com)
* @param $str     source string
* @param $len     cut length
* @param $checkmb if this argument is true, the function treats multibyte character as two bytes. default value is false.
* @param $tail    abbreviation symbol
* @return string  processed string
*/
function strcut_utf8($str, $len, $checkmb=false, $tail='...') {
    preg_match_all('/[\xEA-\xED][\x80-\xFF]{2}|./', $str, $match);
 
    $m    = $match[0];
    $slen = strlen($str);  // length of source string
    $tlen = strlen($tail); // length of tail string
    $mlen = count($m); // length of matched characters
 
    if ($slen <= $len) return $str;
    if (!$checkmb && $mlen <= $len) return $str;
 
    $ret   = array();
    $count = 0;
 
    for ($i=0; $i < $len; $i++) {
        $count += ($checkmb && strlen($m[$i]) > 1)?2:1;
 
        if ($count + $tlen > $len) break;
        $ret[] = $m[$i];
    }
 
    return join('', $ret).$tail;
}


파라미터 설명 
String $str : 원본 문자열
Integer $len : 문자열을 자를 길이
Boolean $checkmb : 이 값을 true로 하면 한글을 영문2자와 같이 취급한다. 기본값은 false
String $tail : 생략후 붙일 줄임 기호

반환값
{String} 처리된 문자열

주의! 이 함수는 UTF-8 문자열을 다룹니다. 다른 charset 에는 적용되지 않습니다.

mb_ 계열 함수가 없는 환경을 위해서 만들어봤습니다.

거의 없을 줄 알았는데 아직도 그런 환경이 있기는 있더라구요. ^^;; 

+ Recent posts