컴퓨터 엑셀 워드 포토숍 구글어스 WINDOWS JAVASCRIPT JAVA C++

 
Monthly Archive
Monday, April 30, 2007

니콘 아빠번들/할배번들 줌 렌즈 초점거리, 35mm 필카 환산; Nikon 18-70mm, 18-135mm

Nikon DSLR 번들 렌즈인 "18-70mm" 와 "18-135mm" 의 각 초점거리 눈금을 35mm 필카용 렌즈로 상호 환산한 표입니다.

일명 "아빠번들" 줌렌즈
정식 명칭: AF-S DX Zoom Nikkor ED 18-70mm F3.5-4.5G (IF)
초점 눈금: 18, 24, 35, 50, 70mm

일명 "할배번들" 줌렌즈
정식 명칭: AF-S DX Zoom Nikkor ED 18-135mm F3.5-5.6G (IF)
초점 눈금: 18, 24, 35, 50, 70, 105, 135mm
(할배번들은, 현재 D80에 많이 번들되고 있더군요)


아빠번들은 70미리까지 눈금이 있지만,
할배번들은 여기에, "105, 135mm" 이런 2가지 눈금이 추가되어 있습니다.



아빠번들/할배번들 초점 눈금을, 필카 렌즈로 환산하면?
====================================================
 18 mm =>   27.42 mm
 24 mm =>   36.56 mm
 35 mm =>   53.32 mm
 50 mm =>   76.17 mm
 70 mm =>  106.64 mm
105 mm =>  159.96 mm
135 mm =>  205.66 mm



필카 단렌즈 각 초점거리에 해당하는, 아빠번들/할배번들 눈금?
===========================================================
  28 mm =>    18.38 mm
  35 mm =>    22.97 mm
  40 mm =>    26.26 mm
  43 mm =>    28.23 mm
  50 mm =>    32.82 mm
  55 mm =>    36.10 mm
  60 mm =>    39.38 mm
  70 mm =>    45.95 mm
  75 mm =>    49.23 mm
  80 mm =>    52.51 mm
  85 mm =>    55.79 mm
  90 mm =>    59.08 mm
 100 mm =>    65.64 mm
 105 mm =>    68.92 mm
 135 mm =>    88.62 mm
 150 mm =>    98.46 mm
 180 mm =>   118.15 mm
 200 mm =>   131.28 mm



위에서 말하는 초점 눈금은 초점거리 눈금입니다. "거리 눈금"이 아니고...


아래의 펄(Perl)소스로, 위의 환산표를 구할 수 있습니다.
파일명: example.pl
#!/usr/bin/perl
use strict; use warnings;

  my $diagonalLength_35mm = sqrt(36**2 + 24**2); # 32mm 필름의 대각선 길이 구하기
  my $diagonalLength_dc = sqrt(23.6**2 + 15.8**2); # 디카 촬상소자의 대각선 길이 구하기
  my $ratio = $diagonalLength_35mm / $diagonalLength_dc; # 위의 두 값의 비율 구하기




  # 니콘 디카 아빠번들/할배번들의 초점 눈금들:
  my @focalLength_dc = ( 18, 24, 35, 50, 70, 105, 135 );

  print "\n아빠번들/할배번들 초점 눈금을, 필카 렌즈로 환산하면?\n";
  print "====================================================\n";
  foreach ( @focalLength_dc ) {
    printf("%3d mm => %7.2f mm\n", $_, $_ * $ratio);
  }




  # 각종 단초점 필카 렌즈의 초점 거리들:
  # 43mm 렌즈는 실재하지 않고 이론적으로만 존재함
  my @focalLength_35mm = ( 28, 35, 40, 43, 50, 55, 60, 70, 75, 80, 85, 90, 100, 105, 135, 150, 180, 200 );

  print "\n\n\n필카 단렌즈 각 초점거리에 해당하는, 아빠번들/할배번들 눈금?\n";
  print "===========================================================\n";
  foreach ( @focalLength_35mm ) {
    printf("%4d mm => %8.2f mm\n", $_, $_ / $ratio);
  }


(업데이트: 펜탁스에 43미리 단렌즈가 있더군요)


▶▶ 니콘 애기번들 줌렌즈 초점거리, 35mm 필름 환산; Nikon 18-55mm F3.5-5.6

▶▶ 디카 전용 렌즈 / 35mm필카 렌즈, 초점 거리 환산표/변환표; Nikon DX Format

니콘 애기번들 줌렌즈 초점거리, 35mm 필름 환산; Nikon 18-55mm F3.5-5.6

Nikon DSLR인 D40X / D40 / D50 에는 18-55mm 줌렌즈가 번들로 붙어 있는데(물론 카메라 바디만 사면 없음), 정확한 명칭은 "AF-S DX Zoom Nikkor ED 18-55mm F3.5-5.6G II" 이고, 흔히 "애기 번들"이라고 부릅니다. 가장 작은 번들 렌즈이기 때문입니다.

번들 렌즈란, 카메라를 사면 본체(바디)에 기본으로 부착되어 있는 렌즈이고, 쉽게 말해서 그 카메라의 표준렌즈입니다. 물론 다른 렌즈를 붙여서 구입할 수도 있습니다.

애기번들 줌렌즈에는 "18mm, 24mm, 35mm, 45mm, 55mm" 이런 초점 거리의 눈금들이 있습니다. 디카용 렌즈의 이 눈금들을 전통적인 35mm 필카 렌즈로 상호 환산하면 다음 표와 같습니다:


애기번들 초점 눈금을, 필카 렌즈로 환산하면?
===========================================
 18 mm =>   27.42 mm
 24 mm =>   36.56 mm
 35 mm =>   53.32 mm
 45 mm =>   68.55 mm
 55 mm =>   83.79 mm



필카 단렌즈 각 초점거리에 해당하는, 애기번들 눈금?
==================================================
  28 mm =>    18.38 mm
  35 mm =>    22.97 mm
  40 mm =>    26.26 mm
  43 mm =>    28.23 mm
  50 mm =>    32.82 mm
  55 mm =>    36.10 mm
  60 mm =>    39.38 mm
  70 mm =>    45.95 mm
  75 mm =>    49.23 mm
  80 mm =>    52.51 mm
  85 mm =>    55.79 mm




다음의 펄(Perl) 소스로 위의 계산 결과를 구할 수 있습니다:
파일명: example.pl
#!/usr/bin/perl
use strict; use warnings;

  my $diagonalLength_35mm = sqrt(36**2 + 24**2); # 32mm 필름의 대각선 길이 구하기
  my $diagonalLength_dc = sqrt(23.6**2 + 15.8**2); # 디카 촬상소자의 대각선 길이 구하기
  my $ratio = $diagonalLength_35mm / $diagonalLength_dc; # 위의 두 값의 비율 구하기




  # 니콘 디카 애기번들의 초점 눈금들:
  my @focalLength_dc = ( 18, 24, 35, 45, 55 );

  print "\n애기번들 초점 눈금을, 필카 렌즈로 환산하면?\n";
  print "===========================================\n";
  foreach ( @focalLength_dc ) {
    printf("%3d mm => %7.2f mm\n", $_, $_ * $ratio);
  }




  # 각종 단초점 필카 렌즈의 초점 거리들:
  # 43mm 렌즈는 실재하지 않고 이론적으로만 존재함
  my @focalLength_35mm = ( 28, 35, 40, 43, 50, 55, 60, 70, 75, 80, 85 );

  print "\n\n\n필카 단렌즈 각 초점거리에 해당하는, 애기번들 눈금?\n";
  print "==================================================\n";
  foreach ( @focalLength_35mm ) {
    printf("%4d mm => %8.2f mm\n", $_, $_ / $ratio);
  }


(업데이트: 펜탁스에 43미리 단렌즈가 있더군요)


▶▶ 니콘 아빠번들/할배번들 줌 렌즈 초점거리, 35mm 필카 환산; Nikon 18-70mm, 18-135mm

▶▶ 디카 전용 렌즈 / 35mm필카 렌즈, 초점 거리 환산표/변환표; Nikon DX Format

디카 전용 렌즈 / 35mm필카 렌즈, 초점 거리 환산표/변환표; Nikon DX Format

"디카(DSLR) 전용 렌즈"와, 전통적인 "35mm필카 렌즈"는, 같은 초점 거리라도 화각이 상당히 다릅니다. 왜냐하면 디카의 필름에 해당하는 CCD나 CMOS 가, 옛날식 35mm 필름보다 면적이 좁기 때문입니다.

필카 렌즈를 디카에 붙이면, 초점 거리가 약 1.5배 증가합니다. 필카에는 대부분 50mm F1.4 렌즈 (일명 50.4 또는 쩜사/점사 렌즈로 불림) 가 붙어 있는데 이것을 디카에 붙이면 76mm 렌즈에 해당됩니다. "망원 렌즈" 쪽에 약간 가까워집니다.

그러나 디카 전용 렌즈를 필카에 붙이면, 사진의 주변부가 검게 나오기 때문에 사용할 수 없습니다.

다음의 환산표는, 니콘 제품을 바탕으로 계산했습니다. 캐논 등 다른 제품도 거의 비슷하지만 정밀한 계산 값이 필요하면 여기에 계산 프로그램 소스가 있습니다: ▶▶ Perl 펄] 디카용 렌즈, 35mm 필카 렌즈, 초점 거리 환산, 변환; DSLR Focal Length Convert


Nikon D40X의 CCD 를 기준으로 합니다.

니콘 렌즈인 니콜(Nikkor) 렌즈를 기준으로 하되, 시그마나 칼 짜이스 등의 다른 회사 제품 렌즈의 초점 거리도 넣었습니다. 요즘 시그마의 30mm F1.4 렌즈 (속칭 "삼식이" 또는 30.4 로 불림) 가 인기가 있는 것 같아서 그것도 포함했습니다. 물론 어느 것이나 다 니콘 DSLR 바디에 붙일 수 있는 것입니다. 다만 Nikon D40 / D40X 에는 자동 초점 모터가 없어서, 일부 렌즈는 자동 초점이 되지 않는 제약은 있습니다.


니콘 DSLR 전용 렌즈 <-> 35미리 렌즈 환산표



* 35mm 필카 필름의 대각선 길이 : 43.2666153055679 mm
* 디카 CCD/CMOS의 대각선 길이  : 28.4007042166211 mm
* 위의 두 값들의 비율          : 1.52343459428188



디카 렌즈를 필카 렌즈로 환산하면?
=================================
 10 mm =>   15.23 mm
 12 mm =>   18.28 mm
 15 mm =>   22.85 mm
 17 mm =>   25.90 mm
 18 mm =>   27.42 mm
 20 mm =>   30.47 mm
 24 mm =>   36.56 mm
 28 mm =>   42.66 mm
 30 mm =>   45.70 mm
 35 mm =>   53.32 mm
 45 mm =>   68.55 mm
 50 mm =>   76.17 mm
 55 mm =>   83.79 mm
 70 mm =>  106.64 mm
 85 mm =>  129.49 mm
105 mm =>  159.96 mm
125 mm =>  190.43 mm
135 mm =>  205.66 mm
200 mm =>  304.69 mm



필카 렌즈를 디카에 붙이면?
==========================
  14 mm =>    21.33 mm
  17 mm =>    25.90 mm
  18 mm =>    27.42 mm
  20 mm =>    30.47 mm
  24 mm =>    36.56 mm
  25 mm =>    38.09 mm
  28 mm =>    42.66 mm
  35 mm =>    53.32 mm
  50 mm =>    76.17 mm
  55 mm =>    83.79 mm
  58 mm =>    88.36 mm
  60 mm =>    91.41 mm
  70 mm =>   106.64 mm
  80 mm =>   121.87 mm
  85 mm =>   129.49 mm
 100 mm =>   152.34 mm
 105 mm =>   159.96 mm
 120 mm =>   182.81 mm
 135 mm =>   205.66 mm
 180 mm =>   274.22 mm
 200 mm =>   304.69 mm
 300 mm =>   457.03 mm
 400 mm =>   609.37 mm
 500 mm =>   761.72 mm
 600 mm =>   914.06 mm
 800 mm =>  1218.75 mm
1000 mm =>  1523.43 mm



[ 디카 렌즈를 필카 렌즈로 환산하면? ] 항목은 디카 렌즈가 필카 렌즈의 어떤 초점거리에 상당하는지 계산한 것입니다. 디카 30mm 렌즈는, 필카의 50mm 표준렌즈와 비슷한 45.70 mm 입니다.


[ 필카 렌즈를 디카에 붙이면? ] 항목은 필카 렌즈를 디카에 붙이면 어떤 초점거리로 변하는지를 나타낸 것입니다. 초점거리가 약1.5배 증가하여 망원 효과가 강해지고 화각은 좁아집니다.



▶▶ 니콘 애기번들 줌렌즈 초점거리, 35mm 필름 환산; Nikon 18-55mm F3.5-5.6

Perl 펄] 디카용 렌즈, 35mm 필카 렌즈, 초점 거리 환산, 변환; DSLR Focal Length Convert

디카(DSLR) 전용 렌즈와, 옛날식 필카 렌즈의 초점 거리를 상호 환산하는 방법입니다. 물론 디카용 렌즈 초점 거리에 약 1.5배를 하면, 필카용 렌즈 초점 거리로 환산되지만, 더 정밀하게 구하기 위해서 이 프로그램을 만들었습니다. 줌 렌즈의 경우, 양 극단의 값과 함께, 초점 눈금들의 값도 포함했습니다.

우선 디카의 필름에 해당하는 CCD나 CMOS의 대각선 길이를 구해야 하는데, 이것은 제품마다 약간의 차이가 있습니다.

Nikon D40X 의 CCD 의 면적은 "23.6 x 15.8mm" 이고 대각선 길이는 28.4mm 인데, 이것을 기준으로 했습니다.

캐논 등 다른 제품이라면 그 제품의 CCD/CMOS 면적을
sqrt(23.6**2 + 15.8**2)
이런 공식에서 변경해 주면 됩니다.

디카용 렌즈와 필카용 렌즈 초점거리 환산
소스 파일명: example.pl
(※ 스크롤 박스 사용법: 박스 안을 마우스로 클릭한 후, 키보드의 좌우 화살표키를 누르면 양옆으로 움직일 수 있습니다. 박스에서 다시 나오려면, 박스 바깥의 아무곳이나 클릭하면 됩니다.)
#!/usr/bin/perl
use strict; use warnings;

  my $diagonalLength_35mm = sqrt(36**2 + 24**2);
  my $diagonalLength_dc = sqrt(23.6**2 + 15.8**2);
  my $ratio = $diagonalLength_35mm / $diagonalLength_dc;


  print "* 35mm 필카 필름의 대각선 길이 : ", $diagonalLength_35mm, " mm\n";
  # 43.2666153055679

  print "* 디카 CCD/CMOS의 대각선 길이  : ", $diagonalLength_dc, " mm\n";
  # 28.4007042166211

  print "* 위의 두 값들의 비율          : ", $ratio, "\n";
  # 1.52343459428188




  # 디카 전용 니콜(Nikkor) 렌즈의, 초점 거리와 줌 렌즈의 초점 눈금들:
  # 현재 "30mm / 10-20mm / 18-125mm / 50-150mm" 는 시그마 렌즈
  my @focalLength_dc = ( 10, 12, 15, 17, 18, 20, 24, 28, 30, 35, 45, 50, 55, 70, 85, 105, 125, 135, 200 );

  print "\n\n\n디카 렌즈를 필카 렌즈로 환산하면?\n";
  print "=================================\n";
  foreach ( @focalLength_dc ) {
    printf("%3d mm => %7.2f mm\n", $_, $_ * $ratio);
  }




  # 필카용 니콜(Nikkor) 렌즈의 초점 거리와 줌 렌즈의 초점 눈금들:
  # "25mm" 는, 니콘용 칼 짜이스 렌즈
  my @focalLength_35mm =
    ( 14, 17, 18, 20, 24, 25, 28, 35, 50, 55, 58, 60, 70, 80, 85, 100, 105, 120, 135, 180, 200, 300, 400, 500, 600, 800, 1000 );

  print "\n\n\n필카 렌즈를 디카에 붙이면?\n";
  print "==========================\n";
  foreach ( @focalLength_35mm ) {
    printf("%4d mm => %8.2f mm\n", $_, $_ * $ratio);
  }



위의 소스의 출력 결과는 여기에 도표로 만들어져 있습니다: ▶▶ 디카 전용 렌즈 / 35mm필카 렌즈, 초점 거리 환산표/변환표; Nikon DX Format

Sunday, April 29, 2007

PHP exif_read_data 함수: 디카 JPG 사진 촬영 정보(EXIF) 읽기

디카 등으로 찍은 사진 파일에서, 카메라 모델명/촬영 날짜/렌즈 초점 거리/조리개/셔터 속도 등의 메타 정보를 기록한 부분을 Exif 라고 합니다. PHP에서 jpg 파일의 메타 정보를 읽는 예제입니다.

exif_read_data() 함수를 사용하는데, 기본 내장 함수가 아니라서, 외부 모듈을 로딩해 주어야만 합니다. 참고: ▶▶ 윈도우용 PHP, Exif 익스텐션(모듈;Extension) 설치/인식 방법

다음 예제에서, EXIF.MakerNote 등의 이진 데이터는 출력에서 제외했습니다.

EXIF 출력 예제


소스 파일명: example.php
(현재 디렉토리에, 디카로 찍은 test.jpg 라는 이름의 사진 파일이 있어야 실행됩니다.)
<html>
<head>
<title>PHP Example</title>
</head>

<body>

<?php

  $filename = "test.jpg";

  // 파일에 EXIF 정보가 기록되어 있는지 확인
  if (exif_read_data($filename, 'IFD0'))
    echo "EXIF 데이터 발견<br />\n";
  else
    echo "EXIF 없음<br />\n";



  echo "<br /><br /><br />\n\n\n"; // 줄바꿈



  $exif = exif_read_data($filename, 0, true);

  foreach ($exif as $key => $section) {
    foreach ($section as $name => $val) {
      if ($key == "EXIF") {
        if ($name == "MakerNote" ||
            $name == "ComponentsConfiguration" ||
            $name == "FileSource" ||
            $name == "SceneType" ||
            $name == "CFAPattern"
            )
          continue;
      }
      echo "$key.$name: $val<br />\n";
    }
  }



?>

</body>
</html>



실행 결과 화면:
(Nikon D40X 로 찍은 사진이라면, 예를 들어 다음과 같이 나옵니다:)
D:\Z>php example.php
<html>
<head>
<title>PHP Example</title>
</head>

<body>

EXIF 데이터 발견<br />
<br /><br /><br />


FILE.FileName: test.jpg<br />
FILE.FileDateTime: 1177761556<br />
FILE.FileSize: 250799<br />
FILE.FileType: 2<br />
FILE.MimeType: image/jpeg<br />
FILE.SectionsFound: ANY_TAG, IFD0, EXIF<br />
COMPUTED.html: width="873" height="594"<br />
COMPUTED.Height: 594<br />
COMPUTED.Width: 873<br />
COMPUTED.IsColor: 1<br />
COMPUTED.ByteOrderMotorola: 0<br />
COMPUTED.ApertureFNumber: f/8.0<br />
COMPUTED.UserComment: LEAD Technologies Inc. V1.01<br />
IFD0.Make: NIKON CORPORATION<br />
IFD0.Model: NIKON D40X<br />
IFD0.XResolution: 72/1<br />
IFD0.YResolution: 72/1<br />
IFD0.ResolutionUnit: 2<br />
IFD0.Software: andoWKS15<br />
IFD0.DateTime: 2007:04:27 23:56:11<br />
IFD0.YCbCrPositioning: 2<br />
IFD0.Exif_IFD_Pointer: 340<br />
IFD0.CustomRendered: 0<br />
IFD0.ExposureMode: 0<br />
IFD0.WhiteBalance: 0<br />
IFD0.DigitalZoomRatio: 1/1<br />
IFD0.FocalLengthIn35mmFilm: 157<br />
IFD0.SceneCaptureType: 0<br />
IFD0.GainControl: 1<br />
IFD0.Contrast: 0<br />
IFD0.Saturation: 0<br />
IFD0.Sharpness: 2<br />
IFD0.SubjectDistanceRange: 0<br />
EXIF.ExposureTime: 10/10000<br />
EXIF.FNumber: 80/10<br />
EXIF.ExposureProgram: 2<br />
EXIF.ISOSpeedRatings: 400<br />
EXIF.ExifVersion: 0221<br />
EXIF.DateTimeOriginal: 2007:04:27 23:56:11<br />
EXIF.DateTimeDigitized: 2007:04:27 23:56:11<br />
EXIF.CompressedBitsPerPixel: 2/1<br />
EXIF.ExposureBiasValue: 0/6<br />
EXIF.MaxApertureValue: 50/10<br />
EXIF.MeteringMode: 5<br />
EXIF.LightSource: 0<br />
EXIF.Flash: 0<br />
EXIF.FocalLength: 1050/10<br />
EXIF.UserComment: LEAD Technologies Inc. V1.01<br />
EXIF.SubSecTime: 30<br />
EXIF.SubSecTimeOriginal: 30<br />
EXIF.SubSecTimeDigitized: 30<br />
EXIF.FlashPixVersion: 0100<br />
EXIF.ColorSpace: 1<br />
EXIF.ExifImageWidth: 850<br />
EXIF.ExifImageLength: 571<br />
EXIF.SensingMethod: 2<br />

</body>
</html>


D:\Z>php example.php > out.html
D:\Z>


php example.php > out.html
이렇게 하면 출력 결과 화면이 out.html 이라는 파일로 하드에 저장됩니다.



Perl에서는 더 자세한 촬영 정보를 구할 수 있습니다: ▶▶ Perl 펄] EXIF 정보 읽기, 디카 촬영 정보 출력 소스; Exif Info Dump



윈도우용 PHP, Exif 익스텐션(모듈;Extension) 설치/인식 방법

JPG 파일에서 Exif 정보를 읽기 위해 exif_read_data() 같은 함수를 사용하려면, Exif 모듈을 로딩해 주어야 합니다. 그렇지 않으면 PHP Fatal error: Call to undefined function exif_read_data() in D:\Z\example.php on line 11 이런 식으로, 함수가 정의되어 있지 않다는 에러가 납니다.

모듈을 로딩하려면, 우선 php.ini 파일을 메모장으로 엽니다. php.ini 는, 기본적으로 "C:\Program Files\PHP" 이런 폴더에 있을 것입니다.

php.ini 파일의 중간쯤에
;extension=php_exif.dll
이런 행이 있는데, 이 행의 맨 앞에 있는 세미콜론(;) 주석을 제거하여
extension=php_exif.dll
이렇게 편집한 후, 이 줄을 모두 선택하여 Ctrl+X키로 잘라내고

밑에 있는
;extension=php_mbstring.dll
이라는 줄 바로 뒤에 Ctrl+V키로 붙여 넣습니다.

그리고
;extension=php_mbstring.dll
이라는 줄의 앞에 있는 세미콜론도 지우고 php.ini 파일을 저장합니다.

최종적으로 다음과 같은 형태가 되어야 합니다.
... 이상 생략...
extension=php_mbstring.dll
extension=php_exif.dll
... 이하 생략

위의 2줄의 순서가 바뀌면 안됩니다. 순서가 뒤바뀌면 다음과 같은 에러 메시지가 적힌 대화상자가 실행시에 나타날 것입니다.

---------------------------
php.exe - DLL 찾기 실패
---------------------------
DLL php_mbstring.dll을(를) 지정한 경로 C:\Program...
...에서 찾을 수 없습니다.
---------------------------
확인
---------------------------



만약 위와 같이 해도 실행이 잘 되지 않고, PHP Warning: PHP Startup: Unable to load dynamic library './php_mbstring.dll' - 지정된 모듈을 찾을 수 없습니다. in Unknown on line 0 이런 경고가 나오면,

php.ini 파일에서
extension_dir
이라는 부분을 메모장 등의 "찾기" 기능으로 찾아봅니다.

PHP를 수동으로 설치했다면,
extension_dir = "./"
이렇게 되어 있을 것입니다. 이 부분을 실제 하드의 모듈들이 있는 디렉토리로 변경해 줍니다. 예를 들어

extension_dir = "C:\Program Files\PHP\ext"

이렇게 적당히 변경해 주면 됩니다.



사용 예제: ▶▶ PHP exif_read_data 함수: 디카 JPG 사진 촬영 정보(EXIF) 읽기

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
<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>


예제 소스를 윈도우 도스창에서 실행한 후, 출력을
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

PHP 예제] 유니코드(UTF-8) 한글 문자열 크기/글자 수 구하기; Unicode String Size

php 소스 파일이 "유니코드(UTF-8)" 인코딩으로 되어 있을 경우, 한글 문자열의 정확한 글자 수를 구하는 방법입니다.

"유니코드(UTF-8)" 인코딩에서, 한글 1글자는 3바이트입니다. 다만, 영문이나 공백문자나 기호 등은 여전히 1바이트입니다.

따라서 그냥 strlen() 함수로, 한글 글자 수를 구하면, 글자 수가 아니라, 바이트 수만 나옵니다.

이때는
mb_strlen("한글문자열", "UTF-8")
이런 함수를 사용하면, 정확한 글자 수를 구할 수 있습니다. 그런데 이 함수는 2바이트 문자열을 다루는 외부 모듈을 로딩해 주어야 사용할 수 있습니다. 참고: ▶▶ 윈도우용 PHP, mbstring 익스텐션(Extension;모듈) 설치/인식 방법

Unicode (UTF-8) 인코딩에서 한글 글자수 출력


파일명: example.php
(이 예제 소스는, 유니코드(UTF-8) 인코딩으로 저장해야 합니다.)
<html>
<head>
<title>PHP Example</title>
</head>

<body>

<?php

  // strlen() 함수는, 유니코드(UTF-8) 인코딩에서
  // 한글은 3바이트, 영문이나 기호는 1바이트로 반환
  print strlen("Cool") . "글자 (영문 바이트 단위)<br />\n";
  // 4글자 (영문 바이트 단위)


  // 한글 1자는 3글자로 간주
  print strlen("똠방각하") . "글자 (영문 바이트 단위)<br />\n";
  // 12글자 (영문 바이트 단위)


  // 유니코드(UTF-8) 한글 글자수 정확히 구하기
  print mb_strlen("똠방각", "UTF-8") . "글자 (한글 1자를 1자로 인식)<br />\n";
  // 3글자 (한글 1자를 1자로 인식)

?>

</body>
</html>


위의 소스를 도스창(콘솔)에서 직접 실행하면 유니코드 문자가 깨져서 이상한 글자가 나올 것입니다.

php example.php > out.html
이렇게 직접 out.html 이라는 파일로 저장하면, out.html 파일 안에

<html>
<head>
<title>PHP Example</title>
</head>

<body>

4글자 (영문 바이트 단위)<br />
12글자 (영문 바이트 단위)<br />
3글자 (한글 1자를 1자로 인식)<br />

</body>
</html>

이런 출력 결과가 들어 있을 것입니다.




유니코드가 아닌, 일반적인 "확장완성형(EUC-KR / CP949)"에서: ▶▶ PHP 예제] 문자열 길이, 한글 글자 수 구하기 함수; CJK String Length

PHP 예제] 문자열 길이, 한글 글자 수 구하기 함수; CJK String Length

strlen() 함수로, 문자열의 길이를 구할 수 있는데, 실은, "영문 문자열이 몇 바이트로 이루어져 있는지"를 구합니다.

알파벳 1글자는 1바이트이기에, 영문 문자열은 strlen() 함수로 정확한 길이를 구할 수 있지만,

한글은 1글자가 2바이트이기에 문제가 생깁니다. strlen() 함수는 한글 1글자를 2글자로 간주합니다.

따라서 한글 문자열의 정확한 글자 수를 구하려면, mb_strlen() 함수를 사용해야 합니다. 그런데 이 함수는 현재 PHP 5 버전에서는, PHP의 환경 설정에서 "멀티 바이트 모듈"을 로딩해 주어야 사용할 수 있습니다. 참고: ▶▶ 윈도우용 PHP, mbstring 익스텐션(Extension;모듈) 설치/인식 방법

strlen, mb_strlen: 영문/한글 문자열 사이즈 얻기


소스 파일명: example.php
<html>
<head>
<title>PHP Example</title>
</head>

<body>

<?php

  // strlen() 함수는, 문자열의 길이를 바이트 단위로 반환합니다.
  // 즉, 한글은 2바이트, 영문이나 기호는 1바이트로 출력
  print strlen("Cool") . "글자 (영문 바이트 단위)<br />\n";
  // 4글자 (영문 바이트 단위)


  // 공백이나 기호도 1글자
  print strlen("Cool Boy!") . "글자 (영문 바이트 단위)<br />\n";
  // 9글자 (영문 바이트 단위)


  // 한글 1자는 2글자로 간주
  print strlen("똠방각하") . "글자 (영문 바이트 단위)\n";
  // 8글자 (영문 바이트 단위)



  // 한글 글자수 정확히 구하기
  // 인코딩을 "EUC-KR" 로 지정하면 똠방각하 등에서 문제 발생.
  // 확장 완성형인 "CP949"를 지정해야 함
  print mb_strlen("똠방각", "CP949") . "글자 (한글 1자를 1자로 인식)<br />\n";
  // 3글자 (한글 1자를 1자로 인식)

?>

</body>
</html>




유니코드(UTF-8) 한글 문자열의 글자 수 구하는 법: ▶▶ PHP 예제] 유니코드(UTF-8) 한글 문자열 크기/글자 수 구하기; Unicode String Size

▶▶ PHP 예제] 배열 크기, 사이즈 구하기 함수, 배열 요소 개수; Array Size Function

윈도우용 PHP, mbstring 익스텐션(Extension;모듈) 설치/인식 방법

한글/일본어/중문 등의 2바이트 문자열을 다루는 함수들은 mbstring 익스텐션을 로딩해 주어야만 사용이 가능합니다. 그렇지 않으면 PHP Fatal error: Call to undefined function mb_strlen() in D:\Z\example.php on line 18 함수가 정의되어 있지 않다는 이런 식의 에러가 납니다.

우선 php.ini 파일을 메모장으로 엽니다. 기본적으로 "C:\Program Files\PHP" 이런 폴더에 있을 것입니다.

php.ini 파일의 중간쯤에
;extension=php_mbstring.dll
이런 행이 있는데, 이 행의 맨 앞에 있는 세미콜론(;) 주석을 제거하여
extension=php_mbstring.dll
이렇게 편집하고 저장합니다.


만약 위와 같이 해도 실행이 잘 되지 않고, PHP Warning: PHP Startup: Unable to load dynamic library './php_mbstring.dll' - 지정된 모듈을 찾을 수 없습니다. in Unknown on line 0 이런 경고가 나오면, php.ini 파일에서
extension_dir
이라는 부분을 메모장 등의 "찾기" 기능으로 찾아봅니다.

PHP를 수동으로 설치했다면,
extension_dir = "./"
이렇게 되어 있을 것입니다. 이 부분을 실제 하드의 모듈들이 있는 디렉토리로 변경해 줍니다. 예를 들어

extension_dir = "C:\Program Files\PHP\ext"

이렇게 적당히 변경해 주면 됩니다.



모듈 실제 사용 예제: ▶▶ PHP 예제] 문자열 길이, 한글 글자 수 구하기 함수; CJK String Length

▶▶ PHP 예제] 유니코드(UTF-8) 한글 문자열 크기/글자 수 구하기; Unicode String Size

Saturday, April 28, 2007

자바스크립트] 이번 달이 몇 분기? 몇 사분기인지 구하기; JavaScript Quarter of the Year

일년을 3개월씩 4부분으로 나눈 것을 분기 또는 사분기(Quarter of the Year)라고 합니다. 자바스크립트에서, 현재 달이 몇 분기인지, 그리고 특정 달이 몇 분기인지를 구하는 소스입니다.

JavaScript: 분기(사분기) 계산 예제 소스


파일명: example.html
<script type="text/javascript">

//////////////////////////////////////////////
// 이번 달이 몇 분기인지 구하기
//

var quarter = Math.ceil( currentMonth() / 3 );

document.write('이번 달은 ', currentMonth(), '월이고, ',  quarter, '분기입니다', '<br />');
// 이번 달이 4월이면:
// '이번 달은 4월이고, 2분기입니다'라고 출력됨



//////////////////////////////////////////////
// 지정한 특정 달이 몇 분기인지 구하기
//

// 7월달은 몇 분기?
document.write(quarterYear(7), '분기', '<br />');
// 3분기

// 10월달은 몇 분기?
document.write(quarterYear(10), '분기', '<br />');
// 4분기




// 특정 달을 입력해 주면,
// 그 달에 해당되는 분기를 반환하는 함수
function quarterYear(month) {
  return Math.ceil( month / 3 );
}


// 현재 월 반환 함수
function currentMonth() {
  var d = new Date();

  return d.getMonth() + 1; // 현재 월만 반환
}

</script>



▶▶ 자바스크립트] 오늘 날짜 시간 구하기, 년월일/시분초 출력; Date Time Print JavaScript

Python 파이썬] 이번 달이 몇 분기? 몇 사분기인지 구하기; Quarter of the Year

올해에서 이달이 몇 분기에 해당하는지를 구하는 방법입니다. 다음 예제에서, 현재 분기 판단은 간단한 공식으로 구하고, 특정 월의 분기 판단은 quarterYear 함수를 사용했습니다.

일년 중의 분기, 사분기 계산 예제
스크립트 파일명: example.py
#!/usr/bin/python
# -*- coding: cp949 -*-

import math
import time


# 특정 달을 파라미터로 입력하면,
# 그 달에 해당되는 분기가 반환되는 함수
def quarterYear(month):
  return math.ceil( month / 3.0 )



# 현재 월 반환 함수
def currentMonth():
  now = time.localtime()
  return now.tm_mon # 현재 월만 반환




##############################################
## 이번 달이 몇 분기인지 구하기
#
quarter = math.ceil( currentMonth() / 3.0 )

print "이번 달은 %d월이고, %d분기입니다" % ( currentMonth(), quarter )
# 이번 달이 4월이면:
# "이번 달은 4월이고, 2분기입니다"라고 출력됩니다.



##############################################
## 지정한 특정 달이 몇 분기인지 구하기
#

# 7월달은 몇 분기?
print "%d분기" % ( quarterYear(7) )
# 3분기

# 10월달은 몇 분기?
print "%d분기" % ( quarterYear(10) )
# 4분기



▶▶ Python/파이썬] 오늘 날짜, 현재 시간 구하기, 년월일 시분초; Get Date Time

자바스크립트] alert 상자, 여러 줄로 줄바꿈 기호, 개행문자; Javascript Alert Newline

자바스크립트의 alert 대화상자/메시지 박스에서, 한줄이 아닌 여러 줄의 텍스트를 쓰려면, C언어에서와 같은 "\n" 이런 이스케이프 문자로 줄바꿈을 할 수 있습니다.

alert 상자에 넣을 문자열에서, 엔터키를 쳐야 할 곳에 "\n"을 다음과 같이 넣어주면 됩니다.

문자열\n문자열\n

"\n" 을 여러 개 넣으면 여러줄로 줄바꿈이 됩니다.

alert 에서, 엔터(Enter) 키 치기 예제


다음과 같은 코드를 HTML 문서에 넣고 클릭하면, 여러 줄로 행갈이된 문자열이 상자에 출력됩니다.
<a href="javascript:alert('첫 행이 여기에 있습니다.\n둘째 행이 여기에 있습니다.\n\n\n이번에는 3줄의 빈줄을 추가했습니다.');">클릭하면 줄바꿈된 문자열이 출력</a>



테스트:
클릭하면 줄바꿈된 문자열이 출력


이런 결과가 나올 것입니다:

---------------------------
Microsoft Internet Explorer
---------------------------
첫 행이 여기에 있습니다.
둘째 행이 여기에 있습니다.


이번에는 3줄의 빈줄을 추가했습니다.
---------------------------
확인
---------------------------



그리고 대화상자에서 Ctrl+C키를 누르면, 대화상자의 텍스트가 클립보드(메모리)로 복사됩니다. 메모장 등의 문서에서 Ctrl+V키로 붙여 넣을 수 있습니다. Ctrl+C키란, Ctrl키를 누르면서 C키를 누르는 것입니다.


▶▶ [JavaScript] 메시지 박스 예제 - 자바스크립트의 alert 상자 만들기

자바스크립트] 방문객 모니터 해상도 구하기/판단; JavaScript Screen Resolution

현재 방문객의 모니터 해상도를 alert 대화상자로 출력하려면 다음과 같은 코드를 사용합니다. 그러면 클릭했을 때 대화상자에, 방문객 컴퓨터의 현재 모니터 해상도가 출력됩니다.

<a href="javascript:alert('현재 모니터 해상도:\n\n' + screen.width + 'x' + screen.height);">클릭하면 여러분의 현재 모니터 해상도가 나옵니다</a>


테스트
클릭하면 여러분의 현재 모니터 해상도가 나옵니다



screen.width 로 가로 해상도를 구하고
screen.height 로 세로 해상도를 구하는데
이것은 함수가 아니라 속성/특성(Property)입니다.


JavaScript로 해상도 알아내기 소스


예를 들어
가로: 1024
세로: 768


평균적인 해상도이군요

이런 식으로, 현재 웹페이지에 가로 세로별로 해상도를 출력하고, 그 해상도가 높은지 낮은지에 대해 if문으로 판단하는 방법입니다.

파일명: example.html
<script type="text/javascript">

document.write('가로: ', screen.width, '<br />', '세로: ', screen.height, '<br />');



document.write('<br /><br />'); // 줄바꿈



if ( (screen.width == 1024) && (screen.height == 768) ) {
  document.write('평균적인 해상도이군요<br />');
}
else if ( (screen.width < 1024) && (screen.height < 768) ) {
  document.write('저해상도이군요.<br />');
}
else if ( (screen.width > 1024) && (screen.height > 768) ) {
  document.write('고해상도이군요.<br />');
}
else
  document.write('비표준 해상도군요.<br />');

</script>



Java 자바] 이번 달이 몇 분기? 몇 사분기인지 구하기; Quarter of the Year

일년 중에서, 현재 달이 몇 분기(사분기)에 속하는지 구하는 방법입니다. 현재 자바는, 분기 계산 메서드를 기본적으로 제공하지 않더군요.

그리고 특정 달의 번호를 파라미터로 입력하면, 그 달이 속하는 분기를 반환하는 메서드(함수)도 다음 예제에 함께 들어 있습니다.

현재 달이 속하는 분기 구하기 예제


소스 파일명: Example.java
import java.util.*;

public class Example {
  public static void main(String[] args) {

    //////////////////////////////////////////////
    // 이번 달이 몇 분기에 속하는지 구하기
    //
    int quarter = (int) Math.ceil( currentMonth() / 3.0 );

    System.out.format("이번 달은 %d월이고, %d분기입니다%n", currentMonth(), quarter);
    // 이번 달이 4월이면:
    // "이번 달은 4월이고, 2분기입니다"라고 출력됨



    //////////////////////////////////////////////
    // 지정한 특정 달이 몇 분기인지 구하기
    //

    // 7월달은 몇 분기?
    System.out.format("%d분기%n", quarterYear(7));
    // 3분기

    // 10월달은 몇 분기?
    System.out.format("%d분기%n", quarterYear(10));
    // 4분기
  }




  // 특정 달을 입력하면,
  // 그 달에 해당되는 분기가 반환되는 메서드
  public static int quarterYear(int month) {
    return (int) Math.ceil( month / 3.0 );
  }


  // 현재 월 반환 메서드
  public static int currentMonth() {
    Calendar cal = Calendar.getInstance();

    return cal.get(Calendar.MONTH) + 1; // 현재 월만 반환
  }


}



▶▶ 자바.Java] 현재 날짜 시간 구하기, 오늘 연월일/시분초 요일 얻기: Get Date Time

C언어] 이번달은 몇 분기? 몇 사분기 판단 함수; Quarter of the Year

이달이 일년 중에서, 몇 분기에 해당하는지 구하는 함수입니다.

그런데 다음 예제에서, "현재 달"을 구하는 함수 currentMonth() 는, 비주얼C 2005 이상에서만 작동합니다.

분기, 사분기 구하기 예제 소스


소스 파일명: example.cpp
#include <stdio.h>
#include <math.h> // ceil
#include <time.h>

int quarterYear(int month);
int currentMonth(void);


int main(void) {

  //////////////////////////////////////////////
  // 이번 달이 몇 분기인지 구하기
  //
  int quarter = (int) ceil( currentMonth() / 3.0 );

  printf("이번 달은 %d월이고, %d분기입니다\n", currentMonth(), quarter);
  // 이번 달이 4월이면:
  // "이번 달은 4월이고, 2분기입니다"라고 출력됨



  //////////////////////////////////////////////
  // 지정한 특정 달이 몇 분기인지 구하기
  //

  // 7월달은 몇 분기?
  printf("%d분기\n", quarterYear(7));
  // 3분기

  // 10월달은 몇 분기?
  printf("%d분기\n", quarterYear(10));
  // 4분기


  return 0;
}




// 특정 달을 입력하면,
// 그 달에 해당되는 분기가 반환되는 함수
int quarterYear(int month) {
  return (int) ceil( month / 3.0 );
}


// 현재 월 반환 함수
// 비주얼C 2005 이상에서 작동
int currentMonth(void) {
  time_t timer;
  struct tm t;

  timer = time(NULL); // 현재 시각을 초 단위로 얻기
  localtime_s(&t, &timer); // 초 단위의 시간을 분리하여 구조체에 넣기

  return t.tm_mon + 1; // 현재 월만 반환
}



▶▶ C언어] 현재 날짜/시간/년월일,시분초 구하기 함수(오늘 날짜 시간): Current Date, Time

Friday, April 27, 2007

Perl 펄] 이번 달은 몇 분기, 몇 사분기 구하기 함수; Quarter of the Year

1년을, 3개월씩, 4부분으로 구획지은 것을 "분기(사분기)"라고 합니다.

분기를 구하려면, 그 달(月)의 번호를 3으로 나눈 후, 그 값을 "올림"해 주면 됩니다. 반올림이 아니라 "올림"입니다.

이달, 특정 달이 몇 사분기? 계산 예제


파일명: example.pl
#!/usr/bin/perl
use strict; use warnings;

use POSIX qw( ceil ); # 올림 함수인 ceil 함수를 위해



  ############################################
  # 이번 달이 몇 분기인지 구하기
  #
  my $quarter = ceil(
                       ( (localtime)[4] + 1 ) / 3
                     );

  printf("%d분기\n", $quarter);
  # 이번 달이 4월이면 "2분기"라고 출력됨



  ############################################
  # 특정 달이 몇 분기인지 구하기
  #

  # 7월달은 몇 분기?
  printf("%d분기\n", quarterYear(7));
  # 3분기

  # 10월달은 몇 분기?
  printf("%d분기\n", quarterYear(10));
  # 4분기




# 특정 달을 입력하면,
# 그 달에 해당되는 분기가 반환되는 함수
# 참고로, $_[0] 이것은 함수의 첫번째 파라미터

sub quarterYear {
  return ceil( $_[0] / 3 );
}



▶▶ Perl/펄] 오늘 날짜/현재 시간 구하기 함수, 년월일/시분초; Get Print Date Time Current

Excel 엑셀] 이번 달은 몇 분기, 몇 사분기 구하기 함수/수식; Quarter of the Year

1년을, 3개월씩, 4부분으로 구획지은 것을 "분기(사분기)"라고 합니다. 엑셀에서는 분기 구하는 함수를 기본적으로 제공하지 않기 때문에 다음과 같은 수식을 사용하여 구해야 합니다.

엑셀의 아무 셀에나

=ROUNDUP(MONTH(TODAY()) / 3, 0)

이런 수식을 입력하면, 현재 달이 몇 분기에 속해 있는지, 즉, 몇 사분기인지 나옵니다. 이번 달이 4월이면 2라고 나옵니다.

=ROUNDUP(MONTH(TODAY()) / 3, 0) & "분기"

이렇게 하면 "2분기"라고 출력됩니다.



특정 달이 몇 사분기인지 구하기


A1셀에 2007-07-01 이런 날짜가 있을 때, 다른 셀에

=ROUNDUP(MONTH(A1) / 3, 0)

이렇게 입력하면 3 이라고 출력됩니다. 3분기라는 뜻입니다.



이것은 엑셀 비베에서 분기를 구하는 것입니다: ▶▶ Excel/엑셀 VBA] 1, 2, 3, 4분기 구하기 (사분기); Quarter of the Year


▶▶ Excel 엑셀] 년월일 시분초 구하기 함수, 년 월 일 시 분 초 추출; Date Time Function

PHP 예제] 1, 2, 3, 4분기 구하기 (사분기); Quarter of the Year

1년의 12달을, 3개월씩, 4등분한 것을 "분기(사분기)"라고 합니다. 분기를 영어로는 Quarter 라고 합니다.

다음 예제는 이번 달이 일년 중의 몇 사분기에 해당하는지 판단하는 것입니다.

date 함수로 이번 달을 구한 후에,
"/3" 으로 "나누기3"을 한 후,
ceil 함수로 소수점 이하를 "올림"하여 정수로 만듭니다.

이번 달은 몇 사분기?


소스 파일명: example.php
<html>
<head>
<title>PHP Example</title>
</head>

<body>

<?php

  // 이번 달이 올해 몇 분기?
  $n = ceil(date("n") / 3);
  echo $n . "분기<br />\n";
  // 이번 달이 4월달일 경우 "2분기"


  // 7월은 몇 분기?
  echo ceil(7 / 3) . "분기<br />\n";
  // 3분기


  // 12월은 몇 분기?
  echo ceil(12 / 3) . "분기<br />\n";
  // 4분기

?>

</body>
</html>



분기에 대한 설명: ▶▶ Excel/엑셀 VBA] 1, 2, 3, 4분기 구하기 (사분기); Quarter of the Year

▶▶ PHP 예제] 현재 날짜 시간, 년월일 시분초 출력 함수; Print Date Time

매스매티카 Mathematica, 변수 선언/대입/초기화 방법; Variable

매스매티카에서는 다음과 같은 방법으로 변수를 선언하고 사용할 수 있습니다. 우선 매스매티카의 노트북(하얀 빈 종이)에

x = 10

이렇게 입력하고, Shift+Enter키를 누르면, x 라는 변수가 선언되고 10 이라는 값이 대입됩니다. 이제

x

라고 입력하고 Shift+Enter키를 누르면 10 이라는 값이 출력됩니다.

그런데 y 라고 입력하면 그냥 y 라고 나올 것입니다. y 라는 변수를 아직 선언해 주지 않았기 때문입니다. 즉, y 라는 변수가 없기 때문에 그냥 y 라고 나옵니다.

x = y = 3

이렇게 하면 기존의 변수 x 와 새 변수 y 에 모두 3 이라는 값이 들어갑니다. 이제 x 또는 y 라고 치면, 3이 출력됩니다.

x + y

이렇게 하면 변수x의 값과, 변수 y 의 값이 합쳐져서 6 이 출력됩니다.

x = N[Sqrt[2], 11]
이러면 루트2의 근사값이 소수점 이하 10자리의 정밀도로, x 에 대입됩니다. 그래서 이제 x 는 1.4142135624 이런 값을 가집니다.


변수 지우기


다른 노트북에서 x 라고 입력해도 1.4142135624 라는 값이 여전히 나옵니다. 모든 노트북을 종료하고 새 노트북을 만든 후에도 x 의 값은 절대 지워지지 않습니다. 불필요한 변수들은 가급적 빨리 지워야 합니다. 그렇지 않으면 변수들이 꼬여서 이상한 결과가 나올 수 있습니다.

x =.

또는

Clear[x]

라고 해주어야만 변수 x 가 완전히 사라집니다.

여러 개의 변수를 한꺼번에 다 지우려면, Quit 명령으로 매스매티카의 커널을 종료해야 합니다. 그런데 이러면 변수들만 지워지는 것이 아니라 매스매티카가 완전히 초기화됩니다. 매스매티카 프로그램 전체를 종료하고 다시 시작하는 것과 같습니다.


변수명은 소문자로 시작


다음과 같은
cool = 7
이런 여러 글자의 변수명도 가능합니다.

coolBoy = 7.9
이렇게 대소문자가 섞인 변수명도 가능합니다. 그런데

사용자 정의의 변수나 함수의 이름은, 소문자로 시작하는 것이 관례입니다. 그래야 사용자가 만든 오브젝트인지 아닌지 쉽게 알 수 있습니다. (매스매티카 내장의 함수/상수 등은, 모두 대문자로 시작합니다.)

변수/함수/상수 등은 대소문자를 엄격히 구분합니다. 소문자 x 의 변수와, 대문자 X 의 변수는 전혀 다릅니다.

다른 프로그래밍 언어에서도 마찬가지지만, 변수명이나 함수명이 숫자로 시작하면 안됩니다. 첫글자는 반드시 알파벳이어야 합니다.

x2 라는 변수명은 가능하지만, 2x 는 불가능합니다. 매스매티카에서, 2x 이것은 "2 곱하기 x" 입니다.


▶▶ 매스매티카 Mathematica, 곱하기 방법, 곱셈 기호; Multiply

매스매티카 Mathematica, 나누기 방법, 나눗셈 기호; Divide

매스매티카에서도 / 이런 슬래시(빗금) 기호로 나눗셈을 합니다. 10 나누기 5 를 하려면, 매스매티카의 노트북(하얀 빈 종이)에

10 / 5

이렇게 입력하고, Shift+Enter키를 누르면, 2 라는 값이 나옵니다.


그런데 3 나누기 2 를 하려고

3 / 2

이렇게 입력하면, "2분의 3"이라는 분수가 나옵니다. 소수로 출력하려면

3 / 2 // N
또는
N[3 / 2]
이렇게 하면, 1.5 라는 값이 나옵니다.



4 / 7 을 하면, "7분의 4"라는 분수가 대신 나옵니다. 매스매티카는, 분수로 표현할 수 있는 것은 소수가 아닌 분수로 나타냅니다. 그래야 정밀도 높은 계산이 가능하기 때문입니다.

"4나누기7" 또는 "7분의4"를, 소수점 이하 30자리까지 구하려면

N[4/7, 30]
이렇게 하면

0.571428571428571428571428571429
이런 결과가 출력됩니다.



▶▶ Mathematica 매스매티카] 소수점 나오게, 소수로 근사값 출력 방법; Decimal Point

▶▶ 매스매티카 Mathematica, 곱하기 방법, 곱셈 기호; Multiply

매스매티카 Mathematica, 곱하기 방법, 곱셈 기호; Multiply

다른 프로그래밍 환경과 마찬가지로, 매스매티카에서도 * 이런 별표(애스터리스크)로 곱셈을 합니다. 매스매티카의 노트북(하얀 빈 종이)에

2 * 3

이렇게 입력하고, Shift+Enter키를 누르면, 2 곱하기 3이 되어 6 이라는 값이 나옵니다.


또한 매스매티카에서는 공백문자(스페이스)로도 곱셈을 할 수 있습니다.

2 3

이렇게 입력해도 6이 나옵니다.

그러나
23

이렇게 공백 없이 붙여 쓰면 곱셈이 되지 않고 그냥 23이라는 값이 나옵니다.


변수의 곱셈


x=2
y=3

x y

라고 하면 x의 값과 y의 값이 곱해져서 6 이 나옵니다. 또는 보다 명시적으로

x * y

라고 해도 됩니다. 그러나

xy

이렇게 변수명들을 공백 없이 붙이면, 곱셈이 되지 않고, "xy" 라는 새 이름의 어떤 변수로 착각하여, 그냥 xy 라는 값이 나옵니다.


숫자와 변수의 곱셈


x가 7일 때

2x

라고 하면, 2 곱하기 7이 되어 14가 나옵니다. 2와 x 사이에 공백이나 별표를 넣어도 마찬가지입니다. 그러나

x2

라고 하면, "x2"라는 이름의 새 변수로 인식하여, 계산이 되지 않습니다.


x 곱하기 2를 계산하려면

x 2

또는

x * 2

라고 해야 합니다.



지수 표현


거듭제곱이 있는 수식에서
x^2y
이런 것은

(x^2) * y
입니다. (x의 제곱) 에 y 를 곱한 것입니다.

x^(2 * y)
이것이 아닙니다.

^ 이런 캐럿 기호는 제곱 연산자인데, 제곱 연산은 다른 사칙연산보다 우선 순위가 높기 때문에 먼저 계산하는 것입니다.


x=3
y=5
일 때

x^2y
라고 하면 45 가 나옵니다.

(x^2)*y
라고 해도 45가 나옵니다.

그러나
x^(2*y)
이렇게 하면 59049 라는 전혀 다른 값이 나오게 됩니다.



▶▶ 매스매티카 Mathematica, 나누기 방법, 나눗셈 기호; Divide

Thursday, April 26, 2007

PHP 예제] 오늘이 올해 몇번째 날인지 구하기; DAY OF YEAR

date("z") 이렇게 date 함수에 z 라는 인수를 넣으면, 오늘이 올해의 몇번째 날인지가 출력됩니다.

어느 해든, 1월 1일이 0 (제로)입니다.

오늘이 2007년 1월 1일이라면, 0
1월 2일이라면, 1
12월 31일이라면, 364 가 나옵니다.

그런데 윤년인 2008년의 12월 31일일 경우에는
365 가 나옵니다.

오늘 날짜 번호 계산 출력


파일명: example.php
<html>
<head>
<title>PHP Example</title>
</head>

<body>

<?php

  // 오늘이 올해 몇번째 날?
  echo date("z") . "<br />\n";

  // 오늘이 2007-04-26일이면 115가 출력됩니다.

?>

</body>
</html>



▶▶ PHP 예제] 현재 날짜 시간, 년월일 시분초 출력 함수; Print Date Time

Excel 엑셀] 지정 범위 나누기; 특정 범위 나눗셈 방법; Range Divide

일반적인 나눗셈 연산은 슬래시(/) 기호를 사용하지만, 특정 범위의 숫자들을 어떤 숫자로 모두 나누거나 할 때에는 다음의 방법을 사용합니다.

예를 들어, A열에

50
90
890
340
120
40
670

이런 숫자가 있고, F1셀에 10이라는 값이 있을 때, A열의 각 숫자를, F1셀의 10으로 모두 나누는 방법입니다.


(1) 우선, F1셀을 선택하고, Ctrl+C키를 눌러 F1셀을 복사합니다. (Ctrl키를 누르면서 C키를 누름)

(2) 이제, A열의 각 숫자들을 모두 선택합니다. 또는 나누어야 할 범위의 숫자들을 선택합니다. "Shift+아래쪽 화살표"키 또는 마우스로 긁어서 선택합니다.

(3) 엑셀 상단 메뉴에서,
편집 > 선택하여 붙여 넣기
를 선택합니다.

(4) 대화상자가 나오는데, "연산"이라는 항목에서, 나누기를 선택하고 "확인" 버튼을 누릅니다.

이제 A열의 각 숫자에 F1셀의 10이 나누어져서

5
9
89
34
12
4
67

이렇게 될 것입니다.



▶▶ Excel 엑셀] 지정 범위 곱하기 함수; PRODUCT 곱셈 방법

Excel 엑셀] 지정 범위 곱하기 함수; PRODUCT 곱셈 방법

일반적인 곱하기 연산은 별표(*) 기호를 사용하지만, 특정 범위의 숫자들을 모두 곱하거나 할 때에는 PRODUCT() 함수를 사용합니다.

그리고 엑셀 메뉴를 사용하여 곱하는 방법도 있습니다.


우선 PRODUCT() 함수를 사용하여 곱셈을 하는 방법입니다.

A1셀부터 시작하여, 아래로 내려가며 다음과 같은 숫자를 입력합니다. 즉, A열에 다음의 숫자를 채웁니다.

5
9
89
34
12
4
67

이제 위의 숫자들을 모두 곱하겠습니다. 다른 아무 셀에,
=PRODUCT(A:A)
이런 수식을 입력하면, A열의 모든 숫자가 곱해져서 437922720 이라는 값이 나옵니다.


만약 5에서 89까지만 곱하려면
=PRODUCT(A1:A3)
이렇게 범위를 지정해 주면, 4005 라는 값이 나옵니다.


만약 5에서 89까지의 숫자에 모두 10을 곱하려면
=PRODUCT(A1:A3, 10)
이렇게 해주면, 40050 이라는 값이 나옵니다.

5에서 89까지의 숫자에다, F1셀에 있는 어떤 값을 곱하려면
=PRODUCT(A1:A3, F1)
이렇게 해주면 됩니다.



셀에 직접 곱하기


A열에

5
9
89
34
12
4
67

이런 숫자가 있고, F1셀에 10이라는 값이 있을 때,

F1셀의 10을, A열의 각 숫자에 모두 곱하는 방법입니다.

(1) 우선, F1셀을 선택하고, Ctrl+C키를 눌러 F1셀을 복사합니다. (Ctrl키를 누르면서 C키를 누름)

(2) 이제, A열의 각 숫자들을 모두 선택합니다. 또는 곱해야 할 범위의 숫자들을 선택합니다. "Shift+아래쪽 화살표"키 또는 마우스로 긁어서 선택합니다.

(3) 엑셀 상단 메뉴에서,
편집 > 선택하여 붙여 넣기
를 선택합니다.

(4) 대화상자가 나오는데, "연산"이라는 항목에서, 곱하기를 선택하고 "확인" 버튼을 누릅니다.

이제 A열의 각 숫자에 F1셀의 10이 곱해져서

50
90
890
340
120
40
670

이렇게 될 것입니다.

이 방법은, 어떤 숫자를 다른 셀에 붙여넣되, 그냥 넣는 것이 아니라, 곱하기 연산까지 하여 입력하는 것입니다.


▶▶ Excel 엑셀] 지정 범위 나누기; 특정 범위 나눗셈 방법; Range Divide

Excel 엑셀] 요일 이름 구하기 함수, 한글/영문 요일명; DAY OF THE WEEK

오늘의 요일명을 한글로 구하려면, 엑셀의 아무 셀에

=TEXT(TODAY(),"aaaa")

이렇게 입력합니다. 오늘이 목요일이라면 "목요일" 이라고 나올 것입니다.


축약하여 표현하려면,

=TEXT(TODAY(),"aaa")

이렇게 하면 그냥 "목" 이라고만 나옵니다.


영문 요일명으로 오늘의 요일을 출력하려면,

=TEXT(TODAY(),"dddd")

이렇게 하면, 오늘이 목요일일 경우, "Thursday" 라고 나옵니다.

=TEXT(TODAY(),"ddd")
이렇게 하면 축약형으로 "Thu" 이렇게 목요일이 영문 약자로 출력됩니다.



특정 날짜의 요일 구하기


A1셀에 가령 "2006-12-26 8:08:56 AM" 이런 날짜가 있을 때, 다른 아무 셀에나

=TEXT(A1,"aaaa")

이렇게 입력하면, 그날이 화요일일 경우 "화요일" 이라고 출력됩니다.


한 글자로, 그날의 한글 요일명을 출력하려면

=TEXT(A1,"aaa")

이렇게 하면 "화" 라고 출력됩니다.



▶▶ Excel 엑셀] 년월일 시분초 구하기 함수, 년 월 일 시 분 초 추출; Date Time Function

Excel 엑셀] 년월일 시분초 구하기 함수, 년 월 일 시 분 초 추출; Date Time Function

날짜/시간이 들어 있는 셀에서, 연월일 시분초를 각각 별도로 나누어서 구하는 방법입니다. 예를 들어, 어떤 셀에 "2007-04-26  1:19:24 PM" 이런 날짜와 시간이 들어 있다면, 여기서 연도인 2007 만 별도로 분리하여 추출하는 것입니다.

우선, A1셀에 =NOW() 라는 함수를 입력하여, 현재 날짜와 시간을 지정합니다. 그러면 "2007-04-26" 이런 식으로 날짜가 나타납니다. 다만 시간은 감추어져 있을 수도 있습니다.


이제 다른 셀에

=YEAR(A1) 이라고 입력하면, 2007 이 출력됩니다.

=MONTH(A1) 이라고 입력하면, 4 가 출력됩니다.

=DAY(A1) 이라고 입력하면, 26 이 출력됩니다.


=HOUR(A1) 이라고 입력하면, 현재 시간이 오후1시라면, 13 이 출력됩니다. (24시간제임)

=MINUTE(A1) 이라고 입력하면, 현재 분이 19 등으로 나옵니다.

=SECOND(A1) 이라고 입력하면, 현재 초가 24 등으로 나옵니다.

=WEEKDAY(A1) 이라고 입력하면, 오늘 요일의 번호가 출력됩니다. 일요일은 1번입니다. 오늘이 목요일이면 5가 나옵니다.




▶▶ 엑셀/Excel] 시트에 현재 날짜와 시간 입력하는 핫키, Put Date Time

▶▶ Excel 엑셀] 요일 이름 구하기 함수, 한글/영문 요일명; DAY OF THE WEEK

▶▶ Excel 엑셀] 이번 달은 몇 분기, 몇 사분기 구하기 함수/수식; Quarter of the Year

Excel 엑셀] 윤년 평년 여부 판단 수식; Leap Year / Common Year

엑셀에서는 윤년 평년 판단 함수를 기본적으로 제공하지 않기에 수식을 직접 입력하여 구해야 합니다.

올해가 윤년(Leap Year)인지 평년(Common Year)인지 알아내려면, 다음의 수식을 아무 셀에나 입력하면 됩니다.

=IF(DAY(DATE(YEAR(TODAY()),3,1)-1) = 29, "윤년", "평년")

이 글을 쓰고 있는 올해는 2007년이고, 2007년은 평년이기에 평년 이라고 나옵니다. 만약 올해가 2008년이라면 2008년은 윤년이기에 윤년이라고 나옵니다.


지정한 특정 연도의 윤년 여부 구하기


만약 A1셀에
2000-06-27
이런 년도가 입력되어 있을 때, 다음과 같은 수식을

=IF(DAY(DATE(YEAR(A1),3,1)-1) = 29, "윤년", "평년")

다른 셀에 입력하면, 2000년이 윤년이기에 윤년이라고 나옵니다.


A1셀의 값을
2001-06-27
로 변경하면 평년으로 출력됩니다. 2001년은 평년입니다.



▶▶ Excel 엑셀] 큰달/작은달 판단, 이번 달은 며칠까지 있나? Last Day in Month

Wednesday, April 25, 2007

Excel 엑셀] 큰달/작은달 판단, 이번 달은 며칠까지 있나? Last Day in Month

이번 달(月), 또는 지정해 준 특정 달에서, 가장 마지막 날짜를 구하는 방법입니다. 즉, 그 달이, 몇 개의 날로 이루어져 있는지 알아내는 방법입니다.

1년의 12개월 중에서, 큰 달은 31일까지 있고, 작은 달은 30일까지 또는 28일까지 있습니다. (윤년일 경우에는 2월달이 29일까지 있습니다.)


이번 달의 날짜 수 구하기


엑셀의 아무 셀에 다음과 같은 수식을 입력합니다. 엑셀에서는, 이런 일을 하는 함수를 기본적으로 지원하지 않기에, 이렇게 만들어 주어야 합니다.

=DAY(DATE(YEAR(TODAY()),MONTH(TODAY())+1,1)-1)

이번 달이 4월달일 경우 30 이 출력. 이번 달이 12월달일 경우 31 이 출력.




지정한 특정 달의 마지막 날 구하기


=DAY(DATE(YEAR(A1),MONTH(A1)+1,1)-1)

A1셀에 2008-02-25 라는 날짜가 있을 경우, 29 가 출력. 2008년 2월은 윤년이기에 2월달이 29일까지 있습니다.

A1셀에 2007-02-25 라는 날짜가 있을 때에는, 28 이 출력. 2007년은 평년이기에..

A1셀에 2007-08-01 이라는 날짜가 있을 때에는, 당연히 31 이 출력됩니다.




큰달/작은달 여부 판단 함수


다음과 같은 수식을 엑셀의 아무 셀에나 넣으면

=IF(DAY(DATE(YEAR(A1),MONTH(A1)+1,1)-1) < 31, "작은달", "큰달")

A1셀의 날짜에 대해, 큰달이면 "큰달", 작은달이면 "작은달"이라고 표시됩니다.



▶▶ Excel 엑셀] 윤년 평년 여부 판단 수식; Leap Year / Common Year

PHP, 큰달/작은달 여부 판단, 이번 달은 며칠까지 있나? Last Day in Month

이번 달(月)이나, 또는 지정해 준 달에서, 가장 마지막 날짜를 구하는 방법입니다. 즉, 그 달이, 몇 개의 날로 이루어져 있는지 알아내는 것입니다.

큰 달은 31일까지 있고, 작은 달은 30일까지 또는 28일까지 있습니다. (윤년일 경우에는 2월달이 29일까지)

현재 달/특정 달의 마지막 일자(날) 구하기


파일명: example.php
<html>
<head>
<title>PHP Example</title>
</head>

<body>

<?php

// 이번 달이 며칠까지 있나 출력
// 이번 달이 4월달인 경우 30이 나옴
echo date("t") . "<br />\n";
// 30


// 2007년 2월 달이 며칠까지 있나 출력
// mktime(시,분,초,월,일,년)
$n = date("t", mktime(1,1,1,2,1,2007));
echo $n . "<br />\n";
// 28


// 2007년 8월 달이 며칠까지 있나 출력
// mktime(시,분,초,월,일,년)
echo date("t", mktime(1,1,1,8,1,2007)). "<br />\n";
// 31


// 2008년 2월 달이 며칠까지 있나 출력
// 2008년은 윤년이기에, 29까지 있어야 함
echo date("t", mktime(1,1,1,2,1,2008)). "<br />\n";
// 29




// 큰 달 / 작은 달 여부 판단
if (date("t", mktime(1,1,1,12,1,2008)) == 31)
  echo "큰달입니다.<br />\n";
else
  echo "작은달입니다.<br />\n";
// 출력 결과: 큰달입니다.
// 12월은 31일까지 있으므로...

?>

</body>
</html>


▶▶ PHP 예제] 현재 날짜 시간, 년월일 시분초 출력 함수; Print Date Time

2007년, 미국 서머타임(일광 절약 시간) 변경; Summer Time 섬머타임

2007년 올해부터, 미국의 "서머타임(Summer Time)" 즉, "일광 절약 시간(DST; Daylight Saving Time)"의 기간이 변경되었습니다.

2007년부터는 미국 현지 날짜로
3월의 2번째 일요일 ~ 11월의 1번째 일요일
까지입니다. 이 기간 동안 1시간이 빨라집니다.


* 미국 서부의 태평양 표준시 Pacific Standard Time (PST) 의 경우, UTC-8 입니다.

* 태평양 표준시의 서머타임 버전인 Pacific Daylight Time (PDT) 은 UTC-7 입니다.

겨울에는 PST 가 적용되고, "3월의 두번째 일요일 ~ 11월의 첫번째 일요일" 동안은 PDT 가 적용됩니다.


그런데 이것은 각 주마다 차이가 있을 수 있기에, 실제 현지의 정확한 시각은

< The World Clock - Time Zones >

이런 곳에서 확인해야 합니다.




참고로, 종래의 미국 서머타임 기간은 현지 날짜로
"4월 1번째 일요일 ~ 10월 마지막 일요일"
까지였습니다.



유럽의 섬머타임 기간: ▶▶ 유럽 서머타임 기간; 프랑스 독일 영국 섬머타임, 일광절약시간; Euro Summer Time

PHP, 태평양 표준시, 동부 표준시, 중국 표준시 구하기; PST-PDT EST-EDT

구글이나 야후 같은 외국 인터넷 기업들은 대부분 미국 서부에 있기에, "태평양 표준시(PST)"를 사용합니다. 단, 서머타임 기간에는 PDT 입니다.

올해 2007년에, PDT의 서머타임 기간이 확장 변경되었는데,
3월의 2번째 일요일 ~ 11월의 1번째 일요일
까지입니다.

현재의 태평양 표준시를 알아야 할 때가 많아서 이 스크립트를 작성했습니다. 서머타임을 자동으로 인식합니다.


중국 표준시의 시차


그리고 "중국 표준시"인 "북경 시간"은, 한국과 1시간의 시차가 있습니다.

한국 표준시 = 세계 표준시 + 9시간
중국 표준시 = 세계 표준시 + 8시간

입니다. 즉, 한국 시간에서 1시간을 빼면(-), 중국 시간이 됩니다. 그리고 중국 대륙 전역에서 단 하나의 시간대만 사용합니다. 북경이나 홍콩이나 상하이나 중국 서부 변방이나 동일한 시간대입니다.



웹용이 아닌, PHP CLI 프로그램으로서 만든 소스이기에, HTML을 위한 줄바꿈은 생략했습니다.

현재의 미국 LA, 파리, 베이징 표준시 구하기


파일명: wtime.php
<?php

  echo "\n한국 표준시:" . "\n";
  date_default_timezone_set("Asia/Seoul");
  echo "\t" . date("Y-m-d H:i:s") . "\n"; // (24시간제)
  echo "\t" . date("Y-m-d h:i:sa") . "\n"; // (12시간제)
  echo "\t" . date("(T P)") . "\n\n"; //

  echo "미국 태평양 표준시:" . "\n";
  date_default_timezone_set("America/Los_Angeles");
  echo "\t" . date("Y-m-d H:i:s") . "\n"; // (24시간제)
  echo "\t" . date("Y-m-d h:i:sa") . "\n"; // (12시간제)
  echo "\t" . date("(T P)") . "\n\n";

  echo "미국 동부 표준시:" . "\n";
  date_default_timezone_set("America/New_York");
  echo "\t" . date("Y-m-d H:i:s") . "\n"; // (24시간제)
  echo "\t" . date("Y-m-d h:i:sa") . "\n"; // (12시간제)
  echo "\t" . date("(T P)") . "\n\n";

  echo "중앙 유럽 표준시:" . "\n";
  date_default_timezone_set("Europe/Paris");
  echo "\t" . date("Y-m-d H:i:s") . "\n"; // (24시간제)
  echo "\t" . date("Y-m-d h:i:sa") . "\n"; // (12시간제)
  echo "\t" . date("(T P)") . "\n\n";

  echo "중국 표준시:" . "\n";
  date_default_timezone_set("Asia/Shanghai");
  echo "\t" . date("Y-m-d H:i:s") . "\n"; // (24시간제)
  echo "\t" . date("Y-m-d h:i:sa") . "\n"; // (12시간제)
  echo "\t" . date("(T P)") . "\n\n";

  echo "세계 표준시:" . "\n";
  date_default_timezone_set("GMT+0");
  echo "\t" . date("Y-m-d H:i:s") . "\n"; // (24시간제)
  echo "\t" . date("Y-m-d h:i:sa") . "\n"; // (12시간제)
  echo "\t" . date("(T P)") . "\n\n";




  // 한국 시간으로 초기화시키기
  date_default_timezone_set("Asia/Seoul");

?>



실행 결과 화면:
D:\Z>php wtime.php

한국 표준시:
        2007-04-25 13:04:59
        2007-04-25 01:04:59pm
        (KST +09:00)

미국 태평양 표준시:
        2007-04-24 21:04:59
        2007-04-24 09:04:59pm
        (PDT -07:00)

미국 동부 표준시:
        2007-04-25 00:04:59
        2007-04-25 12:04:59am
        (EDT -04:00)

중앙 유럽 표준시:
        2007-04-25 06:04:59
        2007-04-25 06:04:59am
        (CEST +02:00)

중국 표준시:
        2007-04-25 12:04:59
        2007-04-25 12:04:59pm
        (CST +08:00)

세계 표준시:
        2007-04-25 04:04:59
        2007-04-25 04:04:59am
        (GMT +00:00)

D:\Z>



위의 소스는 ▶▶ PHP, 세계 시간, 시간대(타임존) 변경/지정; World Time Timezone 이것과 비숫하지만,

현재, 섬머타임 기간인지 아닌지 명확히 알 수 있도록 했습니다.

태평양 표준시의 경우, 겨울에는 시간대 약자가 PST 로 나오지만, 섬머타임 기간이 되면 자동으로 PDT 로 변경됩니다.


PHP, 세계 시간, 시간대(타임존) 변경/지정; World Time Timezone

외국의 현재 시각을 출력하는 PHP 프로그램입니다. 실시간으로 표시되는 시계 프로그램은 아니고, 현재의 세계 시각을 콘솔 화면으로 곧바로 출력합니다.

이 글을 쓰고 있는 현재는, 서양의 경우 대부분 서머타임 기간이기에, PDT, EDT, CEST 등의 일광절약시간의 타임존으로 시간이 출력됩니다. 다시 겨울이 되면, PST, EST, CET 등으로 타임존이 자동으로 변경됩니다. 현재 한국 중국 등에는 서머타임 제도 자체가 없습니다.

아래 예제는
date_default_timezone_set("시간대_문자열")
이런 함수를 사용하여, 스크립트 전체에 적용되는 타임존을 외국 시간대로 변경한 후에, date() 함수로 시간을 구하고, 최종적으로 다시 한국 시간대로 복원시킵니다.

PHP 5 이상에서만 가능합니다.


현재의 세계 시간 표시 예제


소스 파일명: example.php
<html>
<head>
<title>PHP Example</title>
</head>

<body>

<?php
  echo "세계 표준시 (UTC):" . "<br />\n";
  date_default_timezone_set("GMT+0");
  echo date("Y-m-d H:i:s") . "<br /><br />\n\n"; // (24시간제)


  echo "한국 표준시 (KST):" . "<br />\n";
  date_default_timezone_set("Asia/Seoul");
  echo date("Y-m-d H:i:s") . "<br /><br />\n\n"; // (24시간제)


  echo "미국 태평양 표준시 (PST/PDT):" . "<br />\n";
  date_default_timezone_set("America/Los_Angeles");
  echo date("Y-m-d H:i:s") . "<br /><br />\n\n"; // (24시간제)


  echo "미국 동부 표준시 (EST/EDT):" . "<br />\n";
  date_default_timezone_set("America/New_York");
  echo date("Y-m-d H:i:s") . "<br /><br />\n\n"; // (24시간제)


  echo "중앙 유럽/프랑스 파리 표준시 (CET/CEST):" . "<br />\n";
  date_default_timezone_set("Europe/Paris");
  echo date("Y-m-d H:i:s") . "<br /><br />\n\n"; // (24시간제)


  echo "중국 표준시 (UTC/GMT +8):" . "<br />\n";
  date_default_timezone_set("Asia/Shanghai");
  echo date("Y-m-d H:i:s") . "<br /><br />\n\n"; // (24시간제)


  // 한국 시간으로 초기화시키기
  date_default_timezone_set("Asia/Seoul");

?>

</body>
</html>



실행 결과 화면:
D:\Z>php example.php
<html>
<head>
<title>PHP Example</title>
</head>

<body>

세계 표준시 (UTC):<br />
2007-04-24 23:55:12<br /><br />

한국 표준시 (KST):<br />
2007-04-25 08:55:12<br /><br />

미국 태평양 표준시 (PST/PDT):<br />
2007-04-24 16:55:12<br /><br />

미국 동부 표준시 (EST/EDT):<br />
2007-04-24 19:55:12<br /><br />

중앙 유럽/프랑스 파리 표준시 (CET/CEST):<br />
2007-04-25 01:55:12<br /><br />

중국 표준시 (UTC/GMT +8):<br />
2007-04-25 07:55:12<br /><br />


</body>
</html>

D:\Z>



참고: ▶▶ PHP, 태평양 표준시, 동부 표준시, 중국 표준시 구하기; PST-PDT EST-EDT

▶▶ PHP 예제] 현재 날짜 시간, 년월일 시분초 출력 함수; Print Date Time

PHP, 스와치 시계의 인터넷 타임(Swatch Internet Time) 구하기

스와치 시간(Swatch Internet Time)이라는 것이 있습니다. 스위스의 시계 회사인 스와치(Swatch)사에서 만든 시간 체계입니다. 시간대 계산을 하지 않고, 세계 어디에서나 공통의 시간을 사용할 수 있게 하기 위해 만들었다고 합니다. (그러나 날짜 부분은 타임존을 적용해야 했습니다.)

시간대(타임존)가 없기에, 현재 유럽 시각이 @335 라면, 한국 시각과 미국 시각도 똑같이 @335 입니다.

현재 널리 사용되는 시간은 60진법 + 12진법으로 되어 있지만, 스와치 시간은 10진법입니다. 그래서 시간 계산에서 편리한 면이 있습니다.

하루(24시간)를, 000 ~ 999 까지, 1000 비트(Beats)로 구획지어 표현합니다. 즉, Milliday 입니다.

스와치 본사가 있는 스위스 비엘(Biel)이라는 도시를 기준점으로 하는데, 이것은 실은 "중앙 유럽 시간(UTC+1)"입니다. 즉, Central European Time 입니다. 그리고 서머 타임은 없습니다.

중앙 유럽의 오전0시는 000비트, 중앙 유럽의 정오는 500비트입니다. 한국 시간으로는 아침8시가 000비트입니다.

1 일 = 1000 비트
1 시간 = 41.666 비트
1 분 = 0.6944 비트
1 초 = 0.01157 비트

1비트(Beat; Swatch Beat)는 "1분 26.4초"에 즉 "86.4초"에 해당합니다. 비트보다 더 짧은 단위인 Centibeat (센티 비트) 는 0.864초 입니다. 그러나 스와치 시간은, 날짜 처리 부분과, 비트 이하 단위에 대한 공식적인 정의가 즉 Specification 이 없습니다.

앞에 골뱅이를 붙여서

@515

이런 식으로 표현합니다.



인터넷이나 실생활에서, 스와치 시간을 쓰는 곳을 본 적은 없습니다. 그렇지만 재미는 있더군요. 그리고 PHP 에서는 기본적으로 스와치 시간을 지원합니다.


date("B")
이렇게 하면 됩니다. 다음 예제와 같습니다.

스와치 타임 구하기 함수


파일명: example.php
<html>
<head>
<title>PHP Example</title>
</head>

<body>

<?php

// 보통의 한국 시간 (24시간제)
echo date("Y-m-d H:i:s") . "<br />\n";


// 스와치 인터넷 타임 (Swatch Internet Time)
echo "@" . date("B") . "<br />\n";
// 000 ~ 999 까지


// 날짜까지 포함하여 스와치 인터넷 타임 출력
// 날짜에 대한 정의는 없지만,
// 날짜를 중앙유럽시간대로 변경하여 구하는 것이 보통입니다.
echo swatchTime() . "<br />\n";


// 스위스 시간대로 변경하여 날짜를 구한 후
// 다시 한국 시간대로 복귀하는 함수
function swatchTime() {
  date_default_timezone_set("Etc/GMT+1");
  $s = sprintf("d%s %s", date("d.m.Y"), date("@B"));
  date_default_timezone_set("Asia/Seoul");
  return $s;
}

?>

</body>
</html>


실행 결과 화면:
D:\Z>php example.php
<html>
<head>
<title>PHP Example</title>
</head>

<body>

2007-04-25 08:26:24<br />
@018<br />
d24.04.2007 @018<br />

</body>
</html>

D:\Z>


한국의 아침 8시 26분경이 "@018" 이라는 스와치 시간으로 표시되었습니다.

날짜는 중앙 유럽 시간으로 표현되었기에,
d24.04.2007 @018
이렇게 하루 전으로 나옵니다.


▶▶ PHP 예제] 현재 날짜 시간, 년월일 시분초 출력 함수; Print Date Time

Tuesday, April 24, 2007

PHP, 한국식 날짜 시간 출력, 24시간제, 12시간제; YYYY-MM-DD hh:mm:ss

현재 날짜와 시간 문자열을 YYYY-MM-DD hh:mm:ss 이런 한국식 또는 세계 표준 형식으로 출력하는 방법입니다. 각종 프로그래밍 언어에서, 보통은 미국식으로 날짜가 나오는데 이것은 좀 읽기가 힘듭니다. 따라서
2007-04-24 02:22:38pm
이런 형식이 무난합니다.

date() 함수에, 날짜 시간 형식 지정자를 넣어주면 됩니다.

다음 예제는 현재 날짜와 시간을, 24시간제와 12시간제 두 가지 형식의 타임스탬프로 출력합니다.

YYYY-MM-DD hh:mm:ss 포맷으로, 현재 타임 스탬프 구하기


파일명: example.php
<html>
<head>
<title>PHP Example</title>
</head>

<body>

<?php

// 24시간제
echo date("Y-m-d H:i:s") . "<br />\n";

// 12시간제
echo date("Y-m-d h:i:sa") . "<br />\n";

?>

</body>
</html>



실행 결과 화면:
D:\Z>php example.php
<html>
<head>
<title>PHP Example</title>
</head>

<body>

2007-04-24 14:22:38<br />
2007-04-24 02:22:38pm<br />

</body>
</html>

D:\Z>
D:\Z>
D:\Z>php example.php > out.html
D:\Z>



php example.php > out.html
이렇게 하면, 실행 결과가 out.html 이라는 파일로 저장됩니다.


참고: ▶▶ PHP 예제] 현재 날짜 시간, 년월일 시분초 출력 함수; Print Date Time

PHP, 영어 요일 이름 구하기; 요일명 출력 함수; English WEEK Name

PHP에서, 오늘 날짜의 영어식 요일명을 출력할 때에는 date() 함수를 사용합니다. date("D") 라고 하면 3자리로 축약되어 나오고, date("l") 이렇게 소문자 L 을 인수로 주면 영문 요일명이 풀네임으로 반환됩니다.

참고로, 요일을 영어로 "DAY OF THE WEEK" 이라고 합니다. 따라서 프로그래밍 매뉴얼에서, 그냥 WEEK 이 아니라 DAY OF THE WEEK 이라는 부분을 찾아서 읽어야 합니다.

일요일: Sunday (Sun)
월요일: Monday (Mon)
화요일: Tuesday (Tue)
수요일: Wednesday (Wed)
목요일: Thursday (Thu)
금요일: Friday (Fri)
토요일: Saturday (Sat)


아래 예제로 요일명을 영어로 구할 수 있습니다:

오늘 현재의 영문 요일명 구하기


소스 파일명: example.php
<html>
<head>
<title>PHP Example</title>
</head>

<body>

<?php

  // 일요일을 Sun 으로 축약하여 표현
  echo "오늘 요일: " . date("D") . "<br />\n";

  // 일요일을 Sunday 풀네임으로
  echo "오늘 요일: " . date("l") . "<br />\n";
  // date("l") 의 인수는 소문자 L 임

?>

</body>
</html>



실행 결과 화면:
(오늘이 토요일일 경우)
D:\Z>php example.php
<html>
<head>
<title>PHP Example</title>
</head>

<body>

오늘 요일: Sat<br />
오늘 요일: Saturday<br />

</body>
</html>
D:\Z>



한글 요일명 구하기: ▶▶ PHP 예제] 한글 요일 이름 구하기, 요일명 출력; Get-Print DAY OF THE WEEK

PHP 예제] 한글 요일 이름 구하기, 요일명 출력; Get-Print DAY OF THE WEEK

PHP에서 오늘의 요일을 한글로 구하는 방법입니다. date("w") 이런 함수를 사용하면 현재 요일에 해당하는 번호를 반환합니다. 일요일은 0번입니다. 이 번호를 사용하여 요일을 출력할 수 있습니다.

우선, 요일명이 담긴 배열을 정의해 주고, 요일 번호를 배열의 첨자(인덱스)로 넣어주면 됩니다.

한글 요일 이름 얻기


소스 파일명: example.php
<html>
<head>
<title>PHP Example</title>
</head>

<body>

<?php

  $week = array("일", "월", "화", "수", "목", "금", "토");

  $s = $week[date("w")];

  printf("오늘 요일: %s요일<br />\n", $s);

?>

</body>
</html>



실행 결과 화면:
(오늘이 화요일인 경우)
D:\Z>php example.php
<html>
<head>
<title>PHP Example</title>
</head>

<body>

오늘 요일: 화요일<br />

</body>
</html>

D:\Z>



참고: ▶▶ PHP 예제] 현재 날짜 시간, 년월일 시분초 출력 함수; Print Date Time

PHP 예제] 현재 날짜 시간, 년월일 시분초 출력 함수; Print Date Time

date() 함수에, 특정 문자열을 넣으면, 현재 날짜와 시간의 요소들이 반환됩니다. 예를 들어 date("Y") 이렇게 하면 현재 연도를 반환합니다. 올해가 2007년이라면 2007이라는 값입니다.

다음 예제는 현재 날짜와 시간의 각 요소들을 구분하여 출력하는 것입니다.

현재 날짜 시간 출력 예제


예제 파일명: example.php
<html>
<head>
<title>PHP Example</title>
</head>

<body>

<?php

echo "현재 년 (4자리): " . date("Y") . "<br />\n";
echo "현재 년 (2자리): " . date("y") . "<br />\n";

echo "\n<br /><br />\n\n"; // 줄바꿈

echo "현재 월: " . date("n") . "<br />\n";
echo "현재 월 (2자리): " . date("m") . "<br />\n";

echo "\n<br /><br />\n\n";

echo "현재 일: " . date("j") . "<br />\n";
echo "현재 일 (2자리): " . date("d") . "<br />\n";

echo "\n<br /><br />\n\n";

echo "현재 시 (24시간제): " . date("G") . "<br />\n";
echo "현재 시 (24시간제) (2자리): " . date("H") . "<br />\n";

echo "\n<br /><br />\n\n";

echo "현재 시 (12시간제): " . date("g") . "<br />\n";
echo "현재 시 (12시간제) (2자리): " . date("h") . "<br />\n";

echo "\n<br /><br />\n\n";

echo "현재 분 (2자리): " . date("i") . "<br />\n";

echo "\n<br /><br />\n\n";

echo "현재 초 (2자리): " . date("s") . "<br />\n";

echo "\n<br /><br />\n\n";

echo "오전/오후 (대문자): " . date("A") . "<br />\n";
echo "오전/오후 (소문자): " . date("a") . "<br />\n";


echo "\n<br /><br />\n\n";

echo "오늘 요일 번호 (일요일=0): " . date("w") . "<br />\n";


?>

</body>
</html>



실행 결과 화면:
D:\Z>php example.php
<html>
<head>
<title>PHP Example</title>
</head>

<body>

현재 년 (4자리): 2007<br />
현재 년 (2자리): 07<br />

<br /><br />

현재 월: 4<br />
현재 월 (2자리): 04<br />

<br /><br />

현재 일: 9<br />
현재 일 (2자리): 09<br />

<br /><br />

현재 시 (24시간제): 16<br />
현재 시 (24시간제) (2자리): 16<br />

<br /><br />

현재 시 (12시간제): 4<br />
현재 시 (12시간제) (2자리): 04<br />

<br /><br />

현재 분 (2자리): 07<br />

<br /><br />

현재 초 (2자리): 56<br />

<br /><br />

오전/오후 (대문자): PM<br />
오전/오후 (소문자): pm<br />

<br /><br />

오늘 요일 번호 (일요일=0): 1<br />

</body>
</html>


D:\Z>



날짜/시간 한 줄로 보기 쉽게 출력 방법: ▶▶ PHP, 한국식 날짜 시간 출력, 24시간제, 12시간제; YYYY-MM-DD hh:mm:ss

▶▶ PHP 예제] 한글 요일 이름 구하기, 요일명 출력; Get-Print DAY OF THE WEEK

▶▶ PHP, 백만분의 1초 단위 유닉스 타임, 유닉스 시간 구하기 함수; Unix Time

▶▶ PHP, 스와치 시계의 인터넷 타임(Swatch Internet Time) 구하기

▶▶ PHP, 세계 시간, 시간대(타임존) 변경/지정; World Time Timezone

▶▶ PHP, 특정 년도 윤년 평년 여부 판단 함수; is Leap Year

PHP, 백만분의 1초 단위 유닉스 타임, 유닉스 시간 구하기 함수; Unix Time

유닉스 타임(Unix Time; Unix Epoch) 이라는 것은, 세계 표준시로, "1970년 1월 1일 00분 00시 00초"에서, 지금 현재 시각까지 흐른 모든 "초(sec)"를 숫자로 나타낸 것입니다. 이렇게 모든 초마다 일련번호를 붙여 놓으면 날짜 계산이 쉽게 됩니다.

보통 1초 단위이지만, PHP 에서는 100만분의 1초 단위로 유닉스 타임을 구할 수도 있습니다.

Unix Epoch + Microsecond 출력 예제


파일명: example.php
<html>
<head>
<title>PHP Example</title>
</head>

<body>

<?php

  // 그냥 1초 단위로 구하기
  echo time() . "<br />\n";


  // 백만분의 1초 (Microsecond) 단위로 구하기
  $misec = explode(" ", microtime());
  echo "초 단위: " . $misec[1] . "<br />\n";
  echo "백만분의 1초 단위: " . $misec[0] . "<br />\n";


?>

</body>
</html>



"2007-04-23 04:24:02 오후"에 위의 예제를 실행하면
다음과 같은 결과가 나옵니다.

<html>
<head>
<title>PHP Example</title>
</head>

<body>

1177313042<br />
초 단위: 1177313042<br />
백만분의 1초 단위: 0.91306500<br />

</body>
</html>



▶▶ PHP, 유닉스 타임을 날짜 문자열로 변환, 날짜를 유닉스 시간으로; Unix Time to Date

▶▶ PHP 예제] 현재 날짜 시간, 년월일 시분초 출력 함수; Print Date Time

자바스크립트, 16진수 헥사(Hex), 2진수, 10진수 변환 함수; JavaScript

자바스크립트에서, 10진수 숫자를 16진수나 2진수로 상호 변환하는 방법입니다.

"toString(진법)" 이라는 메서드 속에 진법을 넣어주면 됩니다. 가령, 16진수로 변환하려면 16을 넣으면 됩니다.

JavaScript 진법 변환: 십진수 십육진수 이진수


예제 소스 파일명: example.html
<script type="text/javascript">

var n;


// 10진수 255를 16진수로 변환
n = (255).toString(16);
document.write(n, '<br />');
// 출력 결과: ff


// 10진수 255를 2진수로 변환
n = (255).toString(2);
document.write(n, '<br />');
// 출력 결과: 11111111


// 16진수 ff를 10진수로 변환
n = (0xff).toString(10);
document.write(n, '<br />');
// 출력 결과: 255


// 16진수 0a를 2진수로 변환
n = (0x0a).toString(2);
document.write(n, '<br />');
// 출력 결과: 1010


// 변수 속의 10진수 123을 16진수로 변환
var foo = 123;
n = foo.toString(16);
document.write(n, '<br />');
// 출력 결과: 7b


// 변수 속의 10진수 123을 16진수로 변환
// + 대문자로 변환
var foo = 123;
n = foo.toString(16).toUpperCase();
document.write(n, '<br />');
// 출력 결과: 7B


</script>



11111111 이런 숫자는 2진수인지 10진수인지 알 수 없으므로, 우선 이 숫자를 문자열로 저장한 후, parseInt()에서 2진수로 간주하여 10진수로 변환하고, 그것을 다시 다른 진법, 예를 들어 16진수로 변환하면 됩니다. 다음 예제와 같습니다.

<script type="text/javascript">

var n = '11111111'; // 2진수를 문자열로서 저장

n = parseInt(n, 2); // n 속의 숫자를 2진수로 취급하여, 10진수 숫자로 변환


// 10진수화된 2진수를, 16진수로 변환
n = n.toString(16);
document.write(n, '<br />');
// 출력 결과: ff

</script>



Monday, April 23, 2007

PHP 예제] HTML 특수 문자/기호 변환 함수, Special Char

HTML 문법에서는, "<", ">", "&" 이런 기호들은 특수한 의미를 가지고 있습니다. 그래서 이런 기호 자체를 웹페이지에 표현하려면

&lt;
&gt;
&amp;

이런 식으로 변환해 주어야 제대로 표현됩니다. 이런 작업은 텍스트 편집기로도 할 수 있지만, PHP에서는 htmlspecialchars() 라는 함수가 기본적으로 제공되기에 편리하게 변환할 수 있습니다.

다음 예제는,

<div style="font-size:24pt;">자장면 &amp; 물만두 주세요</div>

라는 HTML 문장을, 태그까지 글자 그대로 브라우저에 출력하기 위해서 변환합니다.

특수문자를 &lt; &gt; &amp; 등으로 바꾸기


파일명: example.php
<?php

  $s = '<div style="font-size:24pt;">자장면 &amp; 물만두 주세요</div>';
  echo htmlspecialchars($s) . "\n";
  // &lt;div style=&quot;font-size:24pt;&quot;&gt;자장면 &amp;amp; 물만두 주세요&lt;/div&gt;


  // 큰따옴표는 변환하지 않는 옵션 지정
  // 대부분, 큰따옴표는 변환하지 않아도 됩니다
  echo htmlspecialchars($s, ENT_NOQUOTES) . "\n";
  // &lt;div style="font-size:24pt;"&gt;자장면 &amp;amp; 물만두 주세요&lt;/div&gt;

?>



참고:

▶▶ HTML 공백문자 추가하는 특수기호/코드. 빈 칸(스페이스;Space) 여러 개 적는 법

▶▶ [HTML-CSS 기초 강좌] &nbsp; &amp; &lt; &gt; &quot; 의 의미와 사용법은?

파이어폭스, 사진 리사이즈 기능 끄기; 이미지 크기 축소 해제; Firefox 2 Image Resize Off

파이어폭스 2.x 버전에서, 큰 이미지나 사진을 보면, 현재 브라우저 크기에 맞게 이미지 크기가 자동으로 축소되어 버립니다. 이러면 원본 사진의 크기를 정확히 알 수 없고, 또한 리사이즈된 이미지는 화질도 나빠서 곤란합니다.

환경 설정 대화상자에서 이 설정을 조정할 수 있는 메뉴가 없어졌기에, 다음의 방법으로 직접 환경 설정을 해주어야 합니다.

파이어폭스 브라우저의 주소창에 우선
about:config
이런 주소를 입력합니다. 그러면 파폭의 세밀한 부분까지 조정할 수 있는 특수한 페이지가 나옵니다.


많은 환경설정 항목들이 나오는데, 주소창 바로 아래의 "Filter (필터)" 라는 창에

browser.enable_automatic_image_resizing
이 문자열을 복사하여 붙여 넣으면

browser.enable_automatic_image_resizing

이라는 항목만이 나옵니다. 이 항목의 기본값은 true (참) 입니다. 그래서 큰 이미지는 작은 이미지로 크기가 축소됩니다.

browser.enable_automatic_image_resizing
이 항목을 마우스로 더블 클릭합니다. 그러면 값이 "false (거짓)"로 변경되고, 이미지가 원본 크기 그대로 나오게 됩니다.


about:config 창을 끄면 설정이 자동 저장됩니다.

그런 후, 그림을 다시 부르면 이제 원본 이미지가 나옵니다.



참고:

▶▶ HTML] 웹 이미지(사진, 그림) 크기 변경/조정, 사진 사이즈 축소 태그 속성; Image Size

▶▶ 포토샵] 사진 크기 조절; 이미지 사이즈 조정 변경; Image Size Photoshop

PHP 예제] 다음줄로 줄바꿈 문자 넣기, 엔터 키(Enter) 치기; Newline Char

문자열의 끝에서 다음줄로 넘어가는 줄바꿈을 하는 방법입니다. 대부분의 언어에서와 마찬가지로 PHP에서도 "\n" 이라는 이스케이프 문자로 줄바꿈을 할 수 있습니다. 그런데 이것은 PHP 내부에서의 줄바꿈이고, 실제 브라우저에서는 "\n" 이런 것으로는 줄바꿈이 되지 않기에, "<br />" 이라는 HTML 줄바꿈 태그를 같이 출력해 주어야 합니다. 따라서 최종적으로

"<br />\n"

이런 문자열을 출력하면 다음줄로 줄바꿈이 됩니다. 즉 자동으로 엔터 키가 입력되는 것입니다.

또는 아래 예제처럼 nl2br 함수를 사용할 수도 있습니다.

줄바꿈 기호 / 개행 문자 넣기 예제


소스 파일명: example.php
<html>
<head>
<title>PHP Example</title>
</head>

<body>

<?php

  echo "테스트 문자열\n";
  echo "테스트 문자열\n";
/* 위의 경우에는 화면상으로
      테스트 문자열
      테스트 문자열
   이렇게 줄바꿈이 된 결과가 나오기는 하는데,
   HTML에서는 줄바꿈이 되지 않음
*/


  echo "테스트 문자열<br />\n";
  echo "테스트 문자열<br />\n";
/* 이렇게 HTML 줄바꿈 태그까지 출력하면
      테스트 문자열<br />
      테스트 문자열<br />
   브라우저에서도 줄바꿈이 됩니다.
*/


  // printf 함수로는 이런 식으로 줄바꿈 출력
  printf("%f<br />\n", 123.456);
  printf("%f<br />\n", 123.456);
/* 출력 결과
      123.456000<br />
      123.456000<br />
*/


  // nl2br 함수를 사용하면 \n 앞에 <br />이 자동으로 붙음
  echo nl2br("999\n");
  echo nl2br("999\n");
/* 출력 결과
      999<br />
      999<br />
*/


?>

</body>
</html>



실행 결과 화면:
D:\Z>php example.php
<html>
<head>
<title>PHP Example</title>
</head>

<body>

테스트 문자열
테스트 문자열
테스트 문자열<br />
테스트 문자열<br />
123.456000<br />
123.456000<br />
999<br />
999<br />

</body>
</html>


D:\Z>php example.php > out.html
D:\Z>


php example.php > out.html
이렇게 하면, 출력 결과가 out.html 이라는 파일로 저장됩니다. out.html 이라는 파일을 인터넷 브라우저로 보면 줄바꿈 결과를 확인할 수 있습니다.


참고: ▶▶ PHP 예제] 도스 줄바꿈, 유닉스 개행문자 출력; CR LF

PHP 예제] 파이값, 원주율(PI) 근사값 상수 함수; M_PI

pi() 라는 함수나, 또는 M_PI 라는 상수를 사용하면, 원주율 즉 파이값의 근사값을 구할 수 있습니다.

printf 함수로 그냥 출력하면, 소수점 이하 6자리까지 나오는데, 14자리까지 나오게 하려면, "%.14f" 라는 형식 지정자를 사용하면 됩니다.

파이의 근사값 구하기 예제


파일명: example.php
<html>
<head>
<title>PHP Example</title>
</head>

<body>

<?php

  $num = pi();
  printf("%f<br />\n", $num);
  // 출력 결과: 3.141593


  // 소수점 14자리까지 원주율 출력
  printf("%.14f<br />\n", pi());
  // 출력 결과: 3.14159265358979




  // 원주율 상수로 출력
  printf("%.14f<br />\n", M_PI);
  // 출력 결과: 3.14159265358979
  // 같은 결과임

?>

</body>
</html>



더 정밀도 높은 파이값이 필요하면, 여기에 1000자리까지 구한 표가 있습니다: ▶▶ 파이값, 원주율 Pi 소수점 이하 1000자리까지 구하기; 매스매티카 Mathematica

PHP 예제] 여러 개의 문자열 합치기, 문자 연결 병합; Merge String

여러 개의 문자열을 하나로 합치는 방법입니다. 마침표 연산자 (.) 를 사용합니다. 그리고 어떤 변수에 다른 문자열을 추가하여 합칠 때에는

.=

즉, "점+등호" 연산자를 사용하면 됩니다.

문자열(문자) 연결 예제


소스 파일명: example.php
<html>
<head>
<title>PHP Example</title>
</head>

<body>

<?php

  // 2개의 문자열을 합쳐서 변수에 저장
  $s = "물만두" . "자장면";
  print "$s<br />\n";
  // 출력 결과: 물만두자장면


  // 기존의 변수의 문자열에, 다른 문자열 추가
  $s .= "APPLE";
  print "$s<br />\n";
  // 출력 결과: 물만두자장면APPLE


  // print문에서 "마침표 연산자"로 직접 문자열 연결
  print $s . " 짬뽕" . "<br />\n";
  // 출력 결과: 물만두자장면APPLE 짬뽕


?>

</body>
</html>



실행 결과 화면:
D:\Z>php example.php
<html>
<head>
<title>PHP Example</title>
</head>

<body>

물만두자장면<br />
물만두자장면APPLE<br />
물만두자장면APPLE 짬뽕<br />

</body>
</html>

D:\Z>php example.php > out.html
D:\Z>


php example.php > out.html
이렇게 하면, 화면 출력 결과가 out.html 이라는 파일로 저장됩니다.


PHP 예제] 소수점 이하 자릿수 지정, 실수 2자리까지 출력; Decimal Place

실수(Float)를 소수점 이하 몇 자리까지 출력할지 지정하려면, printf 함수를 사용하는 것이 가장 편리합니다. 예를 들어, 형식 지정자를 이렇게

"%.3f"

지정하면, 소수점 이하 3자리까지 자리수가 지정됩니다. 다음 예제와 같습니다.

실수 자리수 지정 출력 예제


파일명: example.php
<html>
<head>
<title>PHP Example</title>
</head>

<body>

<?php

  $num = 123.45678999999;

  // 기본적으로 6자리까지 출력
  // 반올림됨
  printf("%f<br />\n", $num);
  // 출력 결과: 123.456790


  // 소수점 이하 두 자리까지 출력
  // 반올림됨
  printf("%.2f<br />\n", $num);
  // 출력 결과: 123.46


  // 소수점 이하 모두 제거, 0자리로
  // 반올림됨
  printf("%.0f<br />\n", 1.999);
  // 출력 결과: 2

?>

</body>
</html>



Sunday, April 22, 2007

PHP 팁] print 로, 여러 줄 한꺼번에 출력; Multi-Line Print

print문은 문자열을 1행씩 화면에 출력합니다. 그래서 많은 텍스트를 출력할 때, 앞에 print문을 일일이 쓰기 힙듭니다.

그러나 다음 방법으로 여러 줄을 통째로 출력할 수 있습니다. 자동으로 다음줄로 줄바꿈이 되기에, "\n" 이런 이스케이프 문자를 넣지 않아도 됩니다. 사용 형식은

print <<< FOO
이런저런 텍스트
이런저런 텍스트
이런저런 텍스트
이런저런 텍스트
FOO;

이렇습니다. 다만 위의 "FOO" 라는 것은 임의의 문자열로 대체할 수 있습니다. (알파벳 대문자로만 지정하는 것이 관례입니다.)

위의 경우, FOO에서 FOO까지의 텍스트를 모두 출력하는데, 다만 텍스트 속의 어느 행이 FOO 라는 문자열로만 되어 있으면 PHP Parse error: syntax error, unexpected T_STRING in D:\Z\example2.php on line 18 이런 에러가 납니다.


print <<< FOO
이런저런 텍스트
FOO
이런저런 텍스트
이런저런 텍스트
이런저런 텍스트
FOO;

이러면 에러가 나지만, 그러나


print <<< FOO
이런저런 텍스트
FOO ㅎㅎ
이런저런 텍스트
이런저런 텍스트
FOO;

이렇게 옆에 다른 문자열이 있으면 괜찮습니다.


많은 텍스트 한꺼번에 출력 + 자동 줄바꿈


소스 파일명: example.php
<html>
<head>
<title>PHP Example</title>
</head>

<body>

<?php

$n = 123;


print <<< TEXT
문단을 통째로 프린트하는 방법입니다.<br />
이 구역에, $n 이런 변수들도 그대로 삽입하여<br />
사용할 수 있습니다.<br />
쌍따옴표 등도 "자유롭게" 넣을 수 '있습니다.'<br />
TEXT;

?>

</body>
</html>



실행 결과 화면:
D:\Z>php example.php
<html>
<head>
<title>PHP Example</title>
</head>

<body>

문단을 통째로 프린트하는 방법입니다.<br />
이 구역에, 123 이런 변수들도 그대로 삽입하여<br />
사용할 수 있습니다.<br />
쌍따옴표 등도 "자유롭게" 넣을 수 '있습니다.'<br />
</body>
</html>
D:\Z>
D:\Z>
D:\Z>php example.php > out.html
D:\Z>


php example.php > out.html
이렇게 실행하면 out.html 이라는 파일로 결과가 저장됩니다.


PHP 예제 소스] 2진수 출력 방법, printf 함수 사용하여; Print Bin Number

PHP 의 printf() 함수에는 "%b" 라는 형식 지정자가 있는데, 이것으로 2진수를 화면에 곧바로 출력할 수 있어서 편리합니다.

다음 예제와 같습니다.

이진수 출력; 10진수를 2진수로 변환 출력


파일명: example.php
<html>
<head>
<title>PHP Example</title>
</head>

<body>

<?php

  $num = 15; // 십진수 15 를 대입 (2진수로는 1111)

  // 그냥 평범하게 이진수 출력
  printf("%b<br />\n", $num);
  // 출력 결과: 1111



  // 총 32자리로 (즉, 32비트 이진수 형식으로)
  printf("%032b<br />\n", 15);
  // 출력 결과: 00000000000000000000000000001111
  // 앞의 빈자리를 0으로 채워, 32자리로 만든 것입니다

?>

</body>
</html>



▶▶ PHP 예제 소스] 2진수, 10진수 상호 변환; decbin, bindec

PHP 예제 소스] 2진수, 10진수 상호 변환; decbin, bindec

PHP에서, 10진수와 2진수 상호 변환에는, sprintf / decbin / bindec / base_convert 등의 여러 함수들을 사용할 수 있습니다.

영어로 Binary 는 이진법을 의미하고, 십진법은 Decimal 이라고 하기에, decbin 이나 bindec 같은 함수명이 만들어진 것입니다. 바이너리 파일 (이진파일)과는 직접적인 상관이 없습니다.

이진수 십진수 진법 변환 함수


예제 소스 파일명: example.php
<html>
<head>
<title>PHP Example</title>
</head>

<body>

<?php

  //////////////////////////////////////
  // 10진수 숫자 -> 2진수 문자열로 변환
  //

  $num = 15; // 십진수 15 를 대입. 이진수로는 1111

  // 10진수 15를, 2진수(32비트 포맷)로 변환하여
  // 변수 $s 에 저장
  $s = sprintf("%032b", $num);

  echo $s, "<br />\n"; // 변수 $s의 내용 출력
  // 출력 결과: 00000000000000000000000000001111




  /////////////////////////////////////////
  // 10진수 숫자 -> 2진수 문자열로 변환 출력
  //

  echo decbin(15), "<br />\n";
  // 출력 결과: 1111




  /////////////////////////////////////////
  // 2진수 문자열 -> 10진수 숫자 변환 출력
  //

  echo bindec("1111"), "<br />\n";
  // 출력 결과:
  // 15




  /////////////////////////////////////////
  // 2진수 문자열 -> 10진수 숫자 변환 출력
  //

  // base_convert("어떤숫자의문자열형식", 현재진법, 변환할진법)
  //
  // 다음은, 2진수 문자열인 "1001001100101100000001011010010"을, 10진수로 변환 예제
  echo base_convert("1001001100101100000001011010010", 2, 10), "<br />\n";
  // 출력 결과: 1234567890


?>

</body>
</html>



▶▶ PHP 예제 소스] 2진수 출력 방법, printf 함수 사용하여; Print Bin Number

▶▶ PHP 예제] 16진수 (헥사;Hex), 10진수 (Dec) 상호 변환; base_convert


16진법 2진법 10진수, 아스키 유니코드 상호 변환기: ▶▶ 16진수 헥사, 2진수, 10진수, 8진법 변환 계산기; Hex Calc

PHP 예제] 16진수 (헥사;Hex), 10진수 (Dec) 상호 변환; base_convert

PHP에서는 10진수와 16진수 상호 변환에, sprintf / dechex / hexdec / base_convert 등의 여러 함수들을 사용할 수 있습니다.

sprintf 함수가 가장 유연합니다. 다만 16진수 문자열을 10진수로 변환하려면 다른 함수를 사용해야 합니다. 다음 예제와 같습니다:

십진수 십육진수 진법 변환 함수


소스 파일명: example.php
<html>
<head>
<title>PHP Example</title>
</head>

<body>

<?php

  //////////////////////////////////////
  // 10진수 숫자 -> 16진수 문자열로 변환
  //

  $num = 15; // 십진수 15 를 대입. 십육진수로는 F

  // 10진수 15를 16진수 0F 로 변환하여
  // 변수 $s 에 저장
  $s = sprintf("%02X", $num);

  echo $s, "<br />\n"; // 변수 $s의 내용 출력
  // 출력 결과: 0F




  /////////////////////////////////////////
  // 16진수 상수 -> 10진수 숫자로 변환 출력
  //

  $hex = 0x0F;
  $s = sprintf("%d", $hex);

  echo $s, "<br />\n";
  // 출력 결과: 15



  /////////////////////////////////////////
  // 10진수 숫자 -> 16진수 문자열로 변환 출력
  //

  echo dechex(15), "<br />\n";
  // 출력 결과: f
  // 이것은 앞에 0을 붙일 수 없어서 쓰기 곤란하더군요




  /////////////////////////////////////////
  // 16진수 문자열 -> 10진수 숫자 변환 출력
  //

  echo hexdec("f"), "<br />\n";
  // 출력 결과:
  // 15




  /////////////////////////////////////////
  // 16진수 문자열 -> 10진수 숫자 변환 출력
  //

  // base_convert("어떤숫자의문자열형식", 현재진법, 변환할진법)
  //
  // 다음은, 16진수 문자열인 "f"를, 10진수로 변환 예제
  echo base_convert("f", 16, 10), "<br />\n";
  // 출력 결과: 15


?>

</body>
</html>



▶▶ PHP 예제 소스] 10진수를 16진수 헥사로 출력; Print Hex

▶▶ PHP 예제 소스] 2진수, 10진수 상호 변환; decbin, bindec


<< Home

Categories
Some Recent Posts
Monthly Archives
Top