프로그래밍Perl 텍스트 처리 엔지니어

Perl에서 Unicode (UTF-8) 작업의 특성을 설명하십시오. 다양한 인코딩에서 문자열을 올바르게 읽고, 쓰고, 처리하는 방법과 오류를 발생시키는 흔한 함정을 설명하십시오.

Hintsage AI 어시스턴트로 면접 통과

답변

Perl은 처음부터 Unicode 친화적이지 않았으며, UTF-8 작업에는 명시적인 지시가 필요합니다. 현재의 Perl은 문자열을 내부 추상화(utf8-flagged scalars)로 저장할 수 있지만, 입출력 작업은 특별한 주의가 필요합니다.

올바른 읽기/쓰기:

  1. IO 레이어를 설정하십시오 (binmode, :encoding(UTF-8)).
  2. 소스 코드에 유니코드 리터럴이 포함되어 있다면 use utf8;을 사용하십시오.
  3. STDIN, STDOUT 및 파일의 경우 레이어를 설명하십시오:
open my $fh, '<:encoding(UTF-8)', 'myfile.txt' or die $!; binmode STDOUT, ':encoding(UTF-8)';

Unicode 문자열 작업:

  • 모듈 Encode, utf8, open, charnames.
  • utf8 플래그가 설정된 바이트와 문자열을 혼합하지 마십시오.
use Encode; my $bytes = encode('UTF-8', $string); # 바이트 얻기 my $string = decode('UTF-8', $bytes); # 문자열 얻기

함정:

  • "슬라이어"가 없는 파일은 바이트로 읽히며 — length/substr/정규 표현식 작업이 부정확한 결과를 제공합니다!
  • 외부 소스(데이터베이스, 네트워크)와의 상호작용은 별도의 변환이 필요합니다.
  • 표준 print/read 함수조차 레이어의 설정이 필요합니다.

함정 질문

스크립트의 시작 부분에 use utf8;을 추가하는 것만으로 모든 입출력 작업이 UTF-8에서 이루어질까요?

답변: 아니요! use utf8; 지시는 소스 코드에서 유니코드 리터럴을 해석할 뿐입니다. 입출력에 대해서는 open 또는 binmode/open pragma를 통해 IO 레이어를 설정해야 합니다! 예를 들어:

binmode STDOUT, ':encoding(UTF-8)'; open my $fh, '>:encoding(UTF-8)', $filename;

역사

다국어 프로젝트에서 인터페이스는 콘솔 출력 시 크락오자브라를 표시했으며, 이는 shell이 UTF-8로 작동했지만 Perl이 필요한 STDOUT 레이어를 설정하지 않았기 때문입니다(단지 use utf8만 사용됨). 증상: 키릴 문자의 문자열에 대해 length와 substr이 "부서진" 결과를 주었습니다.

역사

XML 파일(UTF-8)을 처리하는 스크립트가 open 시 레이어를 설정하지 않아 결과적으로 문자열이 바이트와 UTF-8의 "더러운" 혼합이었습니다. 일부 정규 표현식은 전혀 작동하지 않았으며, 데이터를 JSON 형식으로 직렬화하려고 할 때 모듈이 "wide characters"에 대한 오류를 발생시켰습니다.

역사

Perl 서비스를 MySQL 클라이언트와 통합할 때 클라이언트를 utf8로 설정하는 것을 무시하고 바이트 문자열로 작업했습니다. 웹 인터페이스와의 접점에서 결함이 발생했으며, 일부 문자는 손상되어 전달되었고, 일부 쿼리는 데이터 구조를 "파손"시켰습니다. Encode를 통한 명시적 재인코딩과 'mysql_enable_utf8' 설정이 도움이 되었습니다.