MenuIcon

Owl-Networks Archive

LoginIcon

Perl : use encoding 'utf8'; 사용 주의.

| 분류: Perl | 최초 작성: 2008-04-12 05:46:23 |

EUC-KR 인코딩을 사용하는 서버와 Perl 5.8대 초반 버전의 조합에서,
UTF-8 지원을 위하여 이 프라그마를 사용할 수 있다.




use utf8;
use encoding 'utf8';




그러나 UTF-8 을 지원하는 서버에서 돌아가는, Perl 5.8대 후반버전 이후에서는
이 프라그마를 사용시 오히려 내부에서 처리되는 글자가 깨질 수 있다.

[2008/04/12] CentOS (UTF-8) + Perl 5.8.8 조합에서, 위 프라그마 사용시 내부에서 처리되는
한글 문자열이 모두 깨지는 현상 발생. 이 프라그마를 주석 처리하자 정상적으로 실행되었음.


=================================================================================
[추가 정보]
: aero 님의 springnote 에서 발췌 : http://aero.springnote.com/pages/1053508
---------------------------------------------------------------------------------

use encoding ...; pragma
http://search.cpan.org/perldoc?encoding

Dan Kogai씨가 만든 Encode 모듈에 포함되어 있는 기능이며 소스코드의 인코딩, 입출력/파일 I/O에 대한 인코딩을 지정하여 프로그램 내부로 읽어들이면 프로그램 내부적으로 모두 펄 내부 유니코드 포멧으로 변경하여 다루는 구조이나 use utf8; pragma와는 달리 ASCII영역(\x{00}~\x{7f})을 넘는 문자열 뿐만 아니라 바이너리열에 대해서도 무조건 utf-8인코딩으로 변환시켜 버리므로 기존 iso-8859-1을 사용하는 legacy코드들과 호환성에 문제가 있다. (만약에 바이너리 데이터를 다룬다면 \x80~\xff 영역의 데이터는 본의 아니게 펄 내부 유니코드 포멧 utf-8으로 인코딩하려고 하면서 다 깨져버린다.) Perl 유니코드 관련 문서들에 소개가 되고 있으나 최근 설계가 잘못되었다는 지적이 제기되며 Dan Kogai씨도 이를 인정하고 deprecate 시키고 싶다고 했으므로 사용하지 않을 것을 추천

<문제가 발생하는 예제>

#!/usr/bin/perl
use encoding 'euc-kr'; # 이것은 소스의 인코딩을 euc-kr로 함을 뜻한다.
use Devel::Peek;

my $s1 = "\xb0\xa1"; # euc-kr "가"의 인코딩된 바이트시퀀스 형태
my $s2 = "가";
my $s3 = "\xb0"; # 그냥 단순한 바이트 데이터 \xb0

Dump($s1);
Dump($s2);
Dump($s3);



<결과>

SV = PV(0x7a4dbc) at 0x7a4c78
REFCNT = 1
FLAGS = (PADBUSY,PADMY,POK,pPOK,UTF8)
PV = 0x2403f8c "\352\260\200"\0 [UTF8 "\x{ac00}"] <- 자동으로 utf8으로 변환되었다. 내부적으로 decode('euc-kr',"가") 과정이 일어난 것으로 보면 됨
CUR = 3
LEN = 4
SV = PV(0x7a4dd4) at 0x7a4c24
REFCNT = 1
FLAGS = (PADBUSY,PADMY,POK,pPOK,UTF8)
PV = 0x244a9d4 "\352\260\200"\0 [UTF8 "\x{ac00}"] <- 자동으로 utf8으로 변환되었다. 내부적으로 decode('euc-kr',"가") 과정이 일어난 것으로 보면 됨
CUR = 3
LEN = 4
SV = PV(0x7a4dec) at 0x7a4c54
REFCNT = 1
FLAGS = (PADBUSY,PADMY,POK,pPOK,UTF8)
PV = 0x23fec24 ""\0 [UTF8 ""] <- (문제발생)단순한 바이트 데이터일 뿐인 \xb0 이 예기치 않은 euc-kr -> utf8 인코딩 과정에 의해 깨져버렸다. 이런 건 건드리지 말아야 한다. 왜 use encoding 프래그마를 쓰지 않아야 하는지를 보여줌)
CUR = 0
LEN = 4



<다른 예>

use encoding 'utf8' STDOUT=>'euc-kr', STDIN=>'utf8';

위 프래그마는 소스인코딩은 utf8을 쓰며 만약 소스코드에서 utf8문자열이 나오면 자동으로 Perl 내부유니코드 포멧으로 변환한다.( 내부적으로 decode('utf8',"utf8문자열")의 과정이 일어남.) 만약에 표준출력으로 출력한다면(STDOUT=>'euc-kr')의 지정에 의해 자동으로 encode('euc-kr',"Perl내부유니코드포멧문자열")의 동작이 발생하며 표준 입력으로 부터 읽어들인다면 (STDIN=>'utf8')의 지정에 의해 decode('utf8',"입력utf8문자열")의 과정이 일어나기를 기대하며 선언하는 프래그마이다. 하지만 이것도 use encoding 프래그마가 가지는 문제(ASCII 영역을 넘는 바이트인 \x80~\xff 영역의 데이터를 펄 내부 유니코드 포멧 utf-8으로 인코딩하려고 하면서 다 깨져버리는 문제)를 동일하게 가지므로 use encoding 프래그마는 쓰지말자.

=================================================================================

☞ 태그:

☞ 트랙백 접수 모듈이 설치되지 않았습니다.

☞ 덧글이 없고, 트랙백이 없습니다.

덧글을 남기시려면 여기를 클릭하십시오.
[483] < [295] [294] [270] [265] [261] ... [260] ... [254] [249] [247] [246] [245] > [19]

(C) 2000-2018, Owl-Networks. Powered by Perl. 이 페이지는 HTML 5 표준에 따라 작성되었습니다.