정규표현식 검색과 utf8에 대한 궁금증
글쓴이: bootmeta / 작성시간: 금, 2006/12/22 - 12:59오전
우분투 edgy의 vi로 편집하다가 w을 이용해 다음 단어를 이동시 갑자기 특이한 점이 눈에 하나 띄더군요.
"ab한글cd"처럼 영문글자들 사이에 공백없이 한글이 들어가 있는 경우 w이용해 이동시 한단어로 취급하지 않고 한글문자 시작점과 영문문자 시작점에서 멈추게 됩니다.
이것은 vi개발자가 영리하게 다른문자셋으로 이루어진 공백없는 문자열은 한 단어로서 취급하지 않는다라는 생각으로 개발된 것인지 아니면 버그로 봐야할지 의문이 듭니다.
더 나아가 일반적으로 제공되는 awk, grep, 또는 정규표현식을 잘 지원하는 perl이나 php, python같은 언어들에서도 같은 현상이 있을까? utf8한글문자열도 정규표현식에서 제대로 처리하는 걸까?하는 생각도 들고요.
만일 있다면 이런 현상이 제가 잘모르고 있는 utf8상의 코드 구조나 정규표현식의 패턴에 이용되는 특수코드들과 cjkv들과의 충돌현상인가? 하는 의문도 듭니다.
웬지 한글파일명 파일들이나 데이타가 한글인 경우에 awk를 쓰기가 두려워지는군요.
제가 써놓고도 뭔 소리인지 두서없는 글이군요.
한글 코드에 대해 잘 아시는 분이 명쾌한 해답을 날려주시기를 기다리며..
8-)
Forums:
지금 해보니 ,: 등의
지금 해보니 ,: 등의 문자에서도 멈추는데 _ 에서는 안멈추네요.
그렇다는건 멈추는 규칙이 있다는거겠죠.
perl 을 기준으로 /u 옵션으로 utf8 을 정규식에 사용할 수 있습니다.
javascript 에서도 되고요.
/[가-힣]/ 이런게 되는거죠.
utf8 인식을 하게 해 놓으면 . 은 한글도 한글자 단위로 매치됩니다.
아니면 바이트 단위로 잘려서 매치되겠죠.
디자인적인 길이 맞추기는 안좋지만
php 에서 제목자르기 같은것에 정규식으로 자르도록 응용할 수도 있습니다.
$subject = preg_replace('/^(.{30}).*$/u', '\1', $subject);
emerge money
https://xenosi.de/
> "ab한글cd"처럼
> "ab한글cd"처럼 영문글자들 사이에 공백없이 한글이 들어가 있는 경우 w이용해 이동시 한단어로 취급하지
> 않고 한글문자 시작점과 영문문자 시작점에서 멈추게 됩니다.
> 이것은 vi개발자가 영리하게 다른문자셋으로 이루어진 공백없는 문자열은 한 단어로서 취급하지 않는다라는
> 생각으로 개발된 것인지 아니면 버그로 봐야할지 의문이 듭니다.
그러면 띄어쓰기 하지 않는 중국어나 일어같은 경우는 어떻게 해야 할까요? 정규식은 그냥 가장 간단한 룰셋정도로 생각하시면 될 것 같군요.
php 설명서에 보면 word는 locale specific하다고 하였으니, 제대로 구현된 정규식으라면 로켈을 따라야 하고, 그렇다면 로켈에서 제대로 구현되어 있어야 겠군요. 모든 시스템에 대해 모두 같은 방식으로 작동할지에 대해서는 보장하지 못하겠네요. 간단히 우리가 많이 쓰는 PCRE의 문제로 좁혀서 볼 수도 있겠고..
pcre경우 property를 지원하는데 \p{Hangul}같은게 지원되나 봅니다.
> perl 을 기준으로 /u 옵션으로 utf8 을 정규식에 사용할 수 있습니다.
> javascript 에서도 되고요.
> /[가-힣]/ 이런게 되는거죠.
>
오 이런게 되는군요. 그냥 utf8같은 경우라면 무식하게 [하-힣] 같은 경우
\xED(\x95[\x98-\xBF]|[\x96-\x9D][\x80-\xBF]|\x9E[\x80-\xA3] 같은 식으로 해도 됩니다.
온갖 참된 삶은 만남이다 --Martin Buber
감사합니다.
제가 이 글을 올려놓고도 답변을 못달았군요.
제가 몰랐던 많은 것을 알려주셔서 감사합니다. :)
댓글 달기