PHP에서 basename 함수 사용시 한글 파일명이 나라갑니다. 어떻게 방법 없을까요?

사랑천사의 이미지

다른건 왼만하면 괸찮게 보고 넘어 가겠는데...
phpBB2를 돌리시는 분 하나가 파일 어떻게 올리냐고 해서 Attachment Mod를 설치하는 방법을 가르쳐 드리고 몇가지 설정을 손수 해 드렸습니다.

그런데 한글로 된 파일을 올리니 파일명이 전부 지워져 버리더군요. 그래서 phpBB의 소스 코드를 열어서 분석 한 결과 basename 함수가 실행 되는 부분에서 사라 진다는 것을 알아 냈습니다. 이것을 데체 하는 다른 함수를 만들 수 있겠지만,(또한 쓸만한 함수가 많이 잇지만) 이것은 시스템 상의 문제라고 생각 하여 직접 새로운 코드를 작성하고 실험 했습니다.

root@main:~# cat basename_test.php
<?php
 
  $l = array ("bbb/가가가.txt",
              "/aceg/가나다.txt",
              "/data/abcdefg/강의-자료.doc",
              "mnopqr/문법.자료.html",
              "문제지_인쇠용.hwp");
 
  for ($c = 0; $c < count ($l); $c++) {
    echo (basename ($l[$c])."\n");
  }
 
?>
root@main:~# php basename_test.php
.txt
.txt
-자료.doc
.자료.html
_인쇠용.hwp
root@main:~#

결과는 위와 같습니다. basename 함수가 실행은 되지만 한글을 무시하는 현상 비슷한 것이 일어 나고 있는데, 이걸 해결 할 방법이 없을지 궁금합니다. php.ini에서 default_charset 등이 의심스러워 euc-kr로 바꿔 보기도 하고 다른 서버에서는 잘 되나 해서 확인 해 본 결과 이상 없이 동작 했고 default_charset 등과도 상관이 없었습니다.(문제 있는 서버에서도 이 부분은 아무런 상관이 없었습니다.)

아래는 컴파일 하기 전 configure 부분입니다.
-- phpins.sh --

#!/bin/sh
CC="gcc"
CFLAGS="-O2 -march=prescott -pipe"
CXXFLAGS=$CFLAGS
export CFLAGS CXXFLAGS CC
./configure --prefix=/usr/local/php \
--with-apxs2=/usr/local/apache2/bin/apxs --with-mod_charset \
--with-config-file-path=/etc \
--with-openssl --with-kerberos --with-zlib --with-bz2 --with-jpeg-dir \
--with-curl --with-gd --with-jpeg-dir --with-png-dir \
--with-freetype-dir --with-ttf --enable-gd-native-ttf \
--with-imap --with-kerberos --with-imap-ssl \
--with-ldap --with-ldap-sasl --with-openssl-dir --with-mysql --with-pgsql \
--enable-bcmath --enable-calendar --enable-sigchild --enable-magic-quotes \
--enable-sockets --with-regex=php --enable-exif --enable-ftp --enable-mbstring \
--enable-pcntl --enable-shmop --enable-sysvshm --enable-zend-multibyte \
--enable-sysvmsg --enable-sysvsem --with-gmp --with-xmlrpc \
--with-ncurses --with-readline --enable-soap --with-gettext \
--with-tsrm-pthreads

PHP의 버젼은 5.1.6입니다.
File attachments: 
첨부파일 크기
Plain text icon php.ini_.txt45 KB
사랑천사의 이미지

제목이 안 좋아서(주제와 상관 없어 보여서) 아무도 답변을 안 주신다고 생각 하고 제목을 수정 했습니다.

아시는 분 계시면 도움을 주십시요. 부탁 드리겠습니다.
----
Lee Yeosong(이여송 사도요한)
E-Mail: yeosong@gmail.com
MSN: ysnglee2000@hotmail.com
----
웃음... 행복... 평화... (진정한...) 희망... 사랑... 이 세상 모든것이 그렇다면 얼마나 좋을까...(꿈 속의 바램일 뿐인가...)

사람천사

녹차의 이미지

PHP 손 놓은지 오래되서 잘 기억이 안나지만
저도 저 문제를 겪었던 거 같습니다.

이상하게 특정 한글에서 Basename이 잘 동작하지 않더군요.

그래서 그 때 PHP bugs 확인해보고, PHP 버전을 업그레이드 하면서 해결했던 거 같습니다.

Basename이 그리 어려운 함수는 아니라서 직접 구현하셔도 될 겁니다. 좀 느리긴하겠지만 ^^;

사랑천사의 이미지

망막하군요.. 또 그 귀찮은 configure... 하지만 어쩔 수 없지요. 감사합니다. 왜 그 basename가 그러는지... 직접 구현은 가능하지만, 좀 고생 해서 수정 해야 겠군요. 쓰는 사람도 별로 없는데 뭐 느려도 상관 없습니다.

업그레이드 해 보고 안 되면 좀 머리를 써서 만들던가 해 봐야 겠습니다.(다운 그레이드도 고려를...)
----
Lee Yeosong(이여송 사도요한)
E-Mail: yeosong@gmail.com
MSN: ysnglee2000@hotmail.com
----
웃음... 행복... 평화... (진정한...) 희망... 사랑... 이 세상 모든것이 그렇다면 얼마나 좋을까...(꿈 속의 바램일 뿐인가...)

사람천사

ibin의 이미지

PHP5 에서부터 한글로 시작되는 파일명이 잘리는 문제가 발생했습니다.

bugs.php.net 에 보니 중국인들이 몇몇 리포팅을 했지만 만족스러운 답변은 없더군요.

그래서 PHP4, 5에서 호환이 되도록 아래 함수를 사용중입니다.

$basename = preg_replace( '/^.+[\\\\\\/]/', '', $filename );

http://kr.php.net/basename

사랑천사의 이미지

결국 PHP4로 돌아 가야 한다는 거군요... 저도 phpBB를 쓰고 잇습니다만, 저를 제외하고 가상 호스팅을 쓰시는 분들 가운데 그런 분들이 꾀 되니 PHP를 4.x로 내리고 그 중에서 최신 버젼으로 마춰 주는 것이 옳은 선택인 것 같군요. 정규 표현식을 사용한 함수를 만들거나 할 수도 있지만 phpBB에 저걸 다 추가 해 줄 수 있는 것도 아니고 사용자가 자유스럽게 쓸 수 있게 하려면 그럴 수 밖에 없겠네요.

아무튼 관심 가져 주셔서 정말 감사합니다.
----
Lee Yeosong(이여송 사도요한)
E-Mail: yeosong@gmail.com
MSN: ysnglee2000@hotmail.com
----
웃음... 행복... 평화... (진정한...) 희망... 사랑... 이 세상 모든것이 그렇다면 얼마나 좋을까...(꿈 속의 바램일 뿐인가...)

사람천사

7339989b62a014c4ce6e31b3540bc7b5f06455024f22753f6235c935e8e5의 이미지

굳이 PHP를 컴파일해서 쓰시는 이유가 궁금합니다.
패키지 버전을 사용하면 안되나요? :)

사랑천사의 이미지

로케일 정보를 추가 하는 등의 기법은 사용 할 수가 없군요. 저 혼자 phpBB 같은걸 깔아 놓고 쓰는 거라면 상관 없지만, 저 스스로의 문제 보다는 다른 분들의 문제이고 서버를 관리하는 입장에 있기 때문에...

"소스를 전부 이렇게 저렇게 해라." 하기는 곤란하고. PHP 4.4.4를 설치 하는 것으로 대신 했습니다. PHP 4는 1.3.x에 설치 하는게 좋겠지만 2.2.2에 설치 했습니다.

그리고, 직접 Apache HTTPD와 PHP를 컴파일 하는 이유는, 제가 딱 정해 놓고 설정 하는 환경으로만 셋팅 하기 위함입니다. 그리고 컴파일 시에 가능한한 최적화를 적용 하기 위함도 있고 꾸러미 설치시에 발생 할 수 있는 문제들을 직접 컴파일 하면서 옵션 조정등을 하고 하는 과정 속에서 수정 가능하기 때문도 있습니다.

음... PHP 5는 좀 연구를 더 해 봐야 겠습니다.

아무튼 모두들 감사합니다.

추가.
참고로... PHP를 컴파일 하는 이유에 몇 가지를 더 넣어 보자면... readline를 활성화 시킨다거나, ncurses지원을 넣는다거나 뭐 이런 부분들이 이유가 되기도 합니다. CLI가 뭐 그리 중요하냐.. 하시겟지만, 저는 PHP를 Console에서 사용하는 프로그램들의 개발에도 사용 하는 입장입니다. 최적화 문제에 있어서는 종속적ㅇ로 함께 묶이는 라이브러리들이 최적화 되어야만 정말 최적화 된 컴파일 결과물을 얻을 수 있다는 것을 알고는 있지만, 할 수 있는 데 까지의 제가 원하는 최적화를 적용 하는 것이 목표입니다.
----
Lee Yeosong(이여송 사도요한)
E-Mail: yeosong@gmail.com
MSN: ysnglee2000@hotmail.com
----
웃음... 행복... 평화... (진정한...) 희망... 사랑... 이 세상 모든것이 그렇다면 얼마나 좋을까...(꿈 속의 바램일 뿐인가...)

사람천사

lacovnk의 이미지

음. 특정 php파일을 항상 먼저 읽도록 설정할 수 있지 않나요? 이를 이용해서 setlocale을 미리 실행해주면 어떨까요?

사랑천사의 이미지

prepend_file 지정자 같은걸 말씀 하시는 거라면 충분히 가능성 있는 말씀이시긴 합니다. 그 생각은 못 했군요. 서버 점검일을 기회로 해서 한번 실험 해 보고 문제가 없다면 작업 들어가야 겠습니다.
----
Lee Yeosong(이여송 사도요한)
E-Mail: yeosong@gmail.com
MSN: ysnglee2000@hotmail.com
----
웃음... 행복... 평화... (진정한...) 희망... 사랑... 이 세상 모든것이 그렇다면 얼마나 좋을까...(꿈 속의 바램일 뿐인가...)

사람천사

ibin의 이미지

앗... 로케일 추가에 대한 팁은 제가 phpschool에 올린 것인데 오류가 있습니다.

setlocale(LC_CTYPE, 'ko_KR.eucKR') 선언시 fgetcsv()에서는 문제가 해결되었지만,
basename()에서는 문제가 계속되어서 basename_fix()라는 함수를 만들어서 사용했습니다.

일단 prepend_file 적용하기전에 미리 테스트해보셔야 할겁니다.

사랑천사의 이미지

그냥 속 편하게.. PHP 4 급하게 셋팅 해 놓은거 그대로 돌릴갑니다. PHP 5가 필요하신 분이 나타나시면 그 때 방법 더 강구 해 보고.. 일단 지금까진 4로 돌려도 문제 있다는 분은 없으시군요.
----
Lee Yeosong(이여송 사도요한)
E-Mail: yeosong@gmail.com
MSN: ysnglee2000@hotmail.com
----
웃음... 행복... 평화... (진정한...) 희망... 사랑... 이 세상 모든것이 그렇다면 얼마나 좋을까...(꿈 속의 바램일 뿐인가...)

사람천사

박선수의 이미지

한글 파일명만 가져와서 첨부파일 업로드등 사용시

$filename = substr($userfile_name, strrpos($userfile_name, "/")+1);
//$filename = basename("$userfile_name"); // 한글파일 추출 잘 안됨..

응용하시면 도움이 될듯합니다....

사랑천사의 이미지

이렇게 오래 된 것에도 답변을 달아 주시는 군요.
그런데 대부분 답변들이... 코드 레벨에서의 응용에 관한 것들이군요. 시스템 레벨에서의 해결을 원하는 것인데.. 뭐 해결이야 되었지만 일단..
----
Lee Yeosong(이여송 사도요한)
E-Mail: yeosong@gmail.com
MSN: ysnglee2000@hotmail.com
----
웃음... 행복... 평화... (진정한...) 희망... 사랑... 이 세상 모든것이 그렇다면 얼마나 좋을까...(꿈 속의 바램일 뿐인가...)

사람천사

익명 사용자의 이미지

이전 코드

$upload_file = $upload_dir.$extend_name.'_'.urlencode(basename($_FILES['upload']['name'][$i]));

php5 에서부터는 베이스네임을 안사용 하여도 그냥

더 편해짐.

$_FILES['upload']['name'][$i]

$upload_file = $upload_dir.$extend_name.'_'.$_FILES['upload']['name'][$i];

하여도 처리가 됩니다. 단
페이지 에서는

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

정의 해주어야 합니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.