2012-01-02 7 views
2

"עברית"과 같은 UTF8이 아닌 문자를 포함하는 문자열이 있습니다 문자열을 인코딩하지 않고 파일에 문자열을 쓰고 싶습니다. 이렇게하려면 바이너리로 파일을 열었습니다.유니 코드 문자열을 Perl의 이진 파일에 쓰십시오.

open my $fh, ">>:raw", "/tmp/bla"; 
print $fh $mystring; 
close $fh; 

문제는 파일이 손상되었다는 것입니다. 이진 뷰에서 열면 일부 바이트가 손상됩니다. 내가 잘못하고 있니? 문자열을 인코딩하지 않고 파일에 쓸 수 있습니까?

+1

어떻게 UTF8하지? 올바르게 열리면 내부적으로 UTF8이됩니다. –

답변

1

귀하의 평가는 정확합니다. 틀릴 수도 있습니다. You must encode text. :raw is for binary data, 예를 들어. 이미지. UTF-8이 적합하지 않다면 인코딩 ISO-8859-8 또는 Windows-1255를 대신 찾고있을 것입니다.

펄 인코딩의 주제에 대해 배울 http://p3rl.org/UNI을 읽어보십시오.

+0

하지만 왜 이것이 올바르지 않습니까? 나는 과소 평가하지 않는다. 문자열을 바이너리로 씁니까? 파일을 읽는 응용 프로그램에 대한 제어권이 없기 때문에 그것을 인코딩하는 데 문제가 있습니다. 그리고 그것을 디코딩해야합니다.이 파일은 perl이 아니라 c로 작성되었습니다. – Shay

+0

@Shay, C 프로그램에서 기대하는 인코딩은 무엇입니까? – ikegami

+0

@ daxim PDF 파일을 저장하려면 바이너리로 쓰는 것 외에는 다른 것을 찾지 못했습니다. 예 : open (PDF, "> $ filename"); binmode PDF; PDF $ 내용을 인쇄하여 파일을 이진 파일로 작성하십시오. 그 후에는 정력으로 열 수 있고 텍스트로 읽을 수 있습니다. 인코딩을 사용하여 파일을 작성하려고 시도하면 파일이 파손됩니다. PDF가 예외 인 이유는 무엇입니까? –

0

인코딩은 바이트를 사용하는 텍스트 표현입니다. 예를 들어,

ת === UTF-8 ==========> D7 AA 
ת === Windows-1255 ===> FA 
ת === iso-8859-8 =====> FA 

이 파일은 바이트를 포함 할 수 있기 때문에 그것을 인코딩하지 않고 파일에 텍스트를 저장하는 것은 불가능하다. $mystring 이미 바이트 (인코딩 된 텍스트)을 포함하는 경우

코드는 작동하지만, 당신은 당신이 "유니 코드 문자열"을 갖고 있다고.


나는 당신이 당신의 파일이

cat file 

또는 유사한을 사용하여 손상된 결론을 달성 추정. 이 경우 파일을 로캘별로 인코딩해야합니다.

use open ':locale'; 
open my $fh, ">>", "file" or die $!; 
print $fh $mystring; 
관련 문제