Sunday, April 29, 2007
PHP 예제] 도스 줄바꿈, 유닉스 개행문자 출력; CR LF
현재 PHP 5 에서 문자열을 출력하면, 줄바꿈에 좀 문제가 있습니다. 특히 윈도우에서 PHP 를, 일반 프로그램인 CLI로서 사용할 경우입니다.
echo / print / printf 등으로 문자열을 출력할 때 "\n" 이런 이스케이프 문자를 사용하면, 윈도우에서도 항상, 유닉스 스타일 (LF) 로 줄바꿈이 됩니다.
그러나 PHP 코드가 아닌 HTML 영역은, 운영체제에 맞게 나옵니다. 그래서, 한 파일에 두 가지 형식의 줄바꿈이 존재하게 됩니다. 브라우저에서 줄바꿈을 자동으로 알아서 처리하기에 큰 문제는 되지 않지만, 메모장 같은 원시적인 편집기로 출력 파일을 읽으면 줄바꿈이 되지 않고 이상한 문자가 찍히게 됩니다. (윈도우 메모장은 유닉스 줄바꿈을 인식하지 못함.)
그래서 출력 파일의 모든 줄바꿈을 완벽한 "도스 개행문자 (CR LF)"로 출력하려면, "\n" 이 아닌 "\r\n" 으로 줄바꿈을 해주어야 합니다. 그렇지만 이것이 불편하기도 하고 또한 리눅스에서의 호환성에도 문제가 있어서, 다른 해결법을 찾아보아도 없더군요. 업데이트: ▶▶ PHP 5] 운영체제에 맞게 개행문자 출력 상수; 자동 CRLF 줄바꿈; DOS Windows Newline
줄바꿈 문자 테스트용 소스
파일명: example.php
실행 결과 화면:
(옆으로 스크롤 가능)
예제 소스를 윈도우 도스창에서 실행한 후, 출력을
php example.php > out.html
이렇게 out.html 파일로 저장한 다음, Perl로 만든 헥사 뷰어로 본 것입니다. (울트라에디트의 헥사 뷰어로는 줄바꿈 문자를 정확히 볼 수 없음.)
HTML 영역의 HTML 태그들은 운영체제에 맞게 "도스 줄바꿈(0D 0A = CR LF)"이고
"\n" 으로 줄바꿈한 부분은 "유닉스 줄바꿈(0A = LF)"이고
"\r\n" 으로 줄바꿈한 부분은 "도스 줄바꿈(0D 0A = CR LF)"으로 강제로 지정되어 있습니다.
▶▶ PHP 예제] 다음줄로 줄바꿈 문자 넣기, 엔터 키(Enter) 치기; Newline Char
echo / print / printf 등으로 문자열을 출력할 때 "\n" 이런 이스케이프 문자를 사용하면, 윈도우에서도 항상, 유닉스 스타일 (LF) 로 줄바꿈이 됩니다.
그러나 PHP 코드가 아닌 HTML 영역은, 운영체제에 맞게 나옵니다. 그래서, 한 파일에 두 가지 형식의 줄바꿈이 존재하게 됩니다. 브라우저에서 줄바꿈을 자동으로 알아서 처리하기에 큰 문제는 되지 않지만, 메모장 같은 원시적인 편집기로 출력 파일을 읽으면 줄바꿈이 되지 않고 이상한 문자가 찍히게 됩니다. (윈도우 메모장은 유닉스 줄바꿈을 인식하지 못함.)
그래서 출력 파일의 모든 줄바꿈을 완벽한 "도스 개행문자 (CR LF)"로 출력하려면, "\n" 이 아닌 "\r\n" 으로 줄바꿈을 해주어야 합니다. 그렇지만 이것이 불편하기도 하고 또한 리눅스에서의 호환성에도 문제가 있어서, 다른 해결법을 찾아보아도 없더군요. 업데이트: ▶▶ PHP 5] 운영체제에 맞게 개행문자 출력 상수; 자동 CRLF 줄바꿈; DOS Windows Newline
줄바꿈 문자 테스트용 소스
파일명: example.php
<html>
<head>
<title>PHP Example</title>
</head>
<body>
<?php
echo "유닉스 개행문자(Unix)<br />\n";
print "유닉스 개행문자(Unix)<br />\n";
printf("유닉스 개행문자(Unix)<br />\n");
echo "도스/윈도우 개행문자(DOS/Windows)<br />\r\n";
print "도스/윈도우 개행문자(DOS/Windows)<br />\r\n";
printf("도스/윈도우 개행문자(DOS/Windows)<br />\r\n");
?>
</body>
</html>
<head>
<title>PHP Example</title>
</head>
<body>
<?php
echo "유닉스 개행문자(Unix)<br />\n";
print "유닉스 개행문자(Unix)<br />\n";
printf("유닉스 개행문자(Unix)<br />\n");
echo "도스/윈도우 개행문자(DOS/Windows)<br />\r\n";
print "도스/윈도우 개행문자(DOS/Windows)<br />\r\n";
printf("도스/윈도우 개행문자(DOS/Windows)<br />\r\n");
?>
</body>
</html>
실행 결과 화면:
(옆으로 스크롤 가능)
D:\Z>php example.php
<html>
<head>
<title>PHP Example</title>
</head>
<body>
유닉스 개행문자(Unix)<br />
유닉스 개행문자(Unix)<br />
유닉스 개행문자(Unix)<br />
도스/윈도우 개행문자(DOS/Windows)<br />
도스/윈도우 개행문자(DOS/Windows)<br />
도스/윈도우 개행문자(DOS/Windows)<br />
</body>
</html>
D:\Z>php example.php > out.html
D:\Z>hexdump.pl out.html
00000000: 3C 68 74 6D 6C 3E 0D 0A 3C 68 65 61 64 3E 0D 0A <html>..<head>..
00000010: 3C 74 69 74 6C 65 3E 50 48 50 20 45 78 61 6D 70 <title>PHP Examp
00000020: 6C 65 3C 2F 74 69 74 6C 65 3E 0D 0A 3C 2F 68 65 le</title>..</he
00000030: 61 64 3E 0D 0A 0D 0A 3C 62 6F 64 79 3E 0D 0A 0D ad>....<body>...
00000040: 0A C0 AF B4 D0 BD BA 20 B0 B3 C7 E0 B9 AE C0 DA ....... ........
00000050: 28 55 6E 69 78 29 3C 62 72 20 2F 3E 0A C0 AF B4 (Unix)<br />....
00000060: D0 BD BA 20 B0 B3 C7 E0 B9 AE C0 DA 28 55 6E 69 ... ........(Uni
00000070: 78 29 3C 62 72 20 2F 3E 0A C0 AF B4 D0 BD BA 20 x)<br />.......
00000080: B0 B3 C7 E0 B9 AE C0 DA 28 55 6E 69 78 29 3C 62 ........(Unix)<b
00000090: 72 20 2F 3E 0A B5 B5 BD BA 2F C0 A9 B5 B5 BF EC r />...../......
000000A0: 20 B0 B3 C7 E0 B9 AE C0 DA 28 44 4F 53 2F 57 69 ........(DOS/Wi
000000B0: 6E 64 6F 77 73 29 3C 62 72 20 2F 3E 0D 0A B5 B5 ndows)<br />....
000000C0: BD BA 2F C0 A9 B5 B5 BF EC 20 B0 B3 C7 E0 B9 AE ../...... ......
000000D0: C0 DA 28 44 4F 53 2F 57 69 6E 64 6F 77 73 29 3C ..(DOS/Windows)<
000000E0: 62 72 20 2F 3E 0D 0A B5 B5 BD BA 2F C0 A9 B5 B5 br />....../....
000000F0: BF EC 20 B0 B3 C7 E0 B9 AE C0 DA 28 44 4F 53 2F .. ........(DOS/
00000100: 57 69 6E 64 6F 77 73 29 3C 62 72 20 2F 3E 0D 0A Windows)<br />..
00000110: 0D 0A 3C 2F 62 6F 64 79 3E 0D 0A 3C 2F 68 74 6D ..</body>..</htm
00000120: 6C 3E 0D 0A 0D 0A l>....
D:\Z>
<html>
<head>
<title>PHP Example</title>
</head>
<body>
유닉스 개행문자(Unix)<br />
유닉스 개행문자(Unix)<br />
유닉스 개행문자(Unix)<br />
도스/윈도우 개행문자(DOS/Windows)<br />
도스/윈도우 개행문자(DOS/Windows)<br />
도스/윈도우 개행문자(DOS/Windows)<br />
</body>
</html>
D:\Z>php example.php > out.html
D:\Z>hexdump.pl out.html
00000000: 3C 68 74 6D 6C 3E 0D 0A 3C 68 65 61 64 3E 0D 0A <html>..<head>..
00000010: 3C 74 69 74 6C 65 3E 50 48 50 20 45 78 61 6D 70 <title>PHP Examp
00000020: 6C 65 3C 2F 74 69 74 6C 65 3E 0D 0A 3C 2F 68 65 le</title>..</he
00000030: 61 64 3E 0D 0A 0D 0A 3C 62 6F 64 79 3E 0D 0A 0D ad>....<body>...
00000040: 0A C0 AF B4 D0 BD BA 20 B0 B3 C7 E0 B9 AE C0 DA ....... ........
00000050: 28 55 6E 69 78 29 3C 62 72 20 2F 3E 0A C0 AF B4 (Unix)<br />....
00000060: D0 BD BA 20 B0 B3 C7 E0 B9 AE C0 DA 28 55 6E 69 ... ........(Uni
00000070: 78 29 3C 62 72 20 2F 3E 0A C0 AF B4 D0 BD BA 20 x)<br />.......
00000080: B0 B3 C7 E0 B9 AE C0 DA 28 55 6E 69 78 29 3C 62 ........(Unix)<b
00000090: 72 20 2F 3E 0A B5 B5 BD BA 2F C0 A9 B5 B5 BF EC r />...../......
000000A0: 20 B0 B3 C7 E0 B9 AE C0 DA 28 44 4F 53 2F 57 69 ........(DOS/Wi
000000B0: 6E 64 6F 77 73 29 3C 62 72 20 2F 3E 0D 0A B5 B5 ndows)<br />....
000000C0: BD BA 2F C0 A9 B5 B5 BF EC 20 B0 B3 C7 E0 B9 AE ../...... ......
000000D0: C0 DA 28 44 4F 53 2F 57 69 6E 64 6F 77 73 29 3C ..(DOS/Windows)<
000000E0: 62 72 20 2F 3E 0D 0A B5 B5 BD BA 2F C0 A9 B5 B5 br />....../....
000000F0: BF EC 20 B0 B3 C7 E0 B9 AE C0 DA 28 44 4F 53 2F .. ........(DOS/
00000100: 57 69 6E 64 6F 77 73 29 3C 62 72 20 2F 3E 0D 0A Windows)<br />..
00000110: 0D 0A 3C 2F 62 6F 64 79 3E 0D 0A 3C 2F 68 74 6D ..</body>..</htm
00000120: 6C 3E 0D 0A 0D 0A l>....
D:\Z>
예제 소스를 윈도우 도스창에서 실행한 후, 출력을
php example.php > out.html
이렇게 out.html 파일로 저장한 다음, Perl로 만든 헥사 뷰어로 본 것입니다. (울트라에디트의 헥사 뷰어로는 줄바꿈 문자를 정확히 볼 수 없음.)
HTML 영역의 HTML 태그들은 운영체제에 맞게 "도스 줄바꿈(0D 0A = CR LF)"이고
"\n" 으로 줄바꿈한 부분은 "유닉스 줄바꿈(0A = LF)"이고
"\r\n" 으로 줄바꿈한 부분은 "도스 줄바꿈(0D 0A = CR LF)"으로 강제로 지정되어 있습니다.
▶▶ PHP 예제] 다음줄로 줄바꿈 문자 넣기, 엔터 키(Enter) 치기; Newline Char
tag: php
PHP
<< Home