2017-11-01 13 views
0

필자의 perl 스크립트로 생성 한 출력 파일은 그 값을 삽입 할 때 독일어 "움라우트"를 올바르게 처리하지 않는 UNIX SQLplus 프레임 워크에서 사용되기 때문에 코드 세트 cp1252가 아니라 UTF-8을 사용해야합니다. 데이터베이스 열 (Windows 10에서 strawberry perl v5.18을 사용하며 UNIX SQL 환경에서 NLS_LANG 또는 chcp를 설정할 수 없음).Windows 10에서 perl> = 5.18의 출력 파일에 대해 코드 세트 cp1252를 강제 실행하는 방법은 무엇입니까?

이 작은 테스트 스크립트를 사용하면 출력 파일 "testfile1.txt"는 항상 UTF-8이지만 "testfile2.txt"는 예상대로 CP1252라는 것을 재현 할 수 있습니다. "testfile1.txt"의 출력이 텍스트 내에 "특수"문자가 없어도 CP1252가되도록하려면 어떻게해야합니까?

#!/usr/bin/env perl -w 
use strict; 
use Encode; 

# the result file under Windows 10 will have UTF-8 codeset 
open(OUT,'> testfile1.txt');  
binmode(OUT,"encoding(cp-1252)"); 
print OUT encode('cp-1252',"this is a test"); 
close(OUT); 

# the result file under Windows 10 will have Windows-cp1252 codeset 
open(OUT,'> testfile2.txt');  
binmode(OUT,"encoding(cp-1252)"); 
print OUT encode('cp-1252',"this is a test with german umlauts <ÄäÜüÖöß>"); 
close(OUT); 

답변

3

귀하의 질문은 오해에 근거한다고 생각합니다. testfile1.txt에는 this is a test 텍스트가 포함되어 있습니다. 이 문자는 ASCII, Latin-1, UTF-8 및 CP-1252에서 동일한 인코딩을가집니다. testfile1.txt은 이러한 모든 인코딩에서 동시에 유효합니다.


은 다음과 같이 소스 코드에서 문자 유니 코드 문자를 포함하려면 :

print OUT encode('cp-1252',"this is a test with german umlauts <ÄäÜüÖöß>"); 

당신은 상단에

use utf8; 

이 필요합니다.

또한 파일 핸들의 인코딩 레이어를 명시적인 encode() 호출과 결합하지 마십시오. 인코딩 레이어를 설정하고 유니 코드 텍스트를 인쇄하거나 binmode(OUT)을 사용하여 원시 바이트 (encode()에서 반환 됨)를 인쇄하십시오.


그런데 -w은 더 이상 사용하지 않아야합니다.

use warnings; 

pragma로 대체되었습니다. 열린

마찬가지로, bareword는 파일 핸들과 2 개의 인수를 사전 5.6 스타일 코드이며, 2000 년 이후에 작성된 코드에서 사용할 수 없습니다 (펄 5.005 이전 어쨌든 유니 코드/인코딩을 지원하지 않았다.)

고정 된 버전의 코드는 다음과 같습니다.

#!/usr/bin/env perl 
use strict; 
use warnings; 
use utf8; 

{ 
    open(my $out, '>:encoding(cp-1252)', 'testfile1.txt') or die "$0: testfile1.txt: $!\n";  
    print $out "this is a test\n"; 
    close($out); 
} 

{ 
    open(my $out, '>encoding(cp-1252)', 'testfile2.txt') or die "$0: testfile2.txt: $!\n";  
    print $out "this is a test with german umlauts <ÄäÜüÖöß>\n"; 
    close($out); 
} 
+0

_Schei 인코딩 ... _ :) – simbabque

+0

그 빠르고 훌륭한 답변에 감사드립니다. 따라서 "인코딩 유형"은 파일 내에 "키"로 저장되지 않지만 그 안에 저장된 이진 값에 의해 정의됩니다. 필자의 필자는 필자가 편집자가 선택한 코드 세트로 파일을 저장할 수있는 옵션을 제공했다. 그런데 괄호 안에 두 개의 "open"문을 묶어야하는 이유는 무엇입니까? – drvolk

+0

@drvolk 수정하십시오. 텍스트 파일은 자체 인코딩을 저장하지 않습니다. 프로그램은 인코딩이 무엇인지 알기 만하면됩니다 (또는 파일의 바이트를 기반으로 추측하지만 잘못 될 수 있습니다). 내 코드의 블록은'$ out' 핸들의 범위를 제한하는 것입니다. – melpomene