서버의 php가 iconv()를 설정하지 않았을 경우

이한길의 이미지

iconv는 인코딩을 변경해주는 훌륭한 툴입니다.
그리고 이것을 php에서도 iconv라는 함수를 사용해서
문자열의 인코딩을 변경할 수 있습니다..

다 아시는 이야기라.. 조금 죄송합니다..
글구 과연 팁에 올려도 될까 싶었지만..혹시나 싶어서..
올립니다.

아래는 그 함수를 사용할 수 없을 경우
하지만 서버에 iconv가 있는 경우 iconv바이너리 실행코드를 사용해서
php의 iconv()함수를 대신할 만한 간단한 코드입니다.

if(!function_exists(iconv))
{
	$tmpfile = $tmp_dir_path."/tmp001";
	$iconv_path = "/usr/bin/iconv";
	
	function iconv($from, $to, $text)
	{
		global $iconv_path, $tmpfile;
		$p = popen($iconv_path." --from-code=".$from." --to-code=".$to." --output=".$tmpfile, "w");
		fwrite($p, $text);
		pclose($p);
		
		$fp = fopen($tmpfile, "r");
		$text = fread($fp, filesize($tmpfile));
		fclose($fp);
		
		return $text;
	}
}
Forums: 
lifthrasiir의 이미지

이한길 wrote:
iconv는 인코딩을 변경해주는 훌륭한 툴입니다.
그리고 이것을 php에서도 iconv라는 함수를 사용해서
문자열의 인코딩을 변경할 수 있습니다..

다 아시는 이야기라.. 조금 죄송합니다..
글구 과연 팁에 올려도 될까 싶었지만..혹시나 싶어서..
올립니다.

아래는 그 함수를 사용할 수 없을 경우
하지만 서버에 iconv가 있는 경우 iconv바이너리 실행코드를 사용해서
php의 iconv()함수를 대신할 만한 간단한 코드입니다.

if(!function_exists(iconv))
{
	$tmpfile = $tmp_dir_path."/tmp001";
	$iconv_path = "/usr/bin/iconv";
	
	function iconv($from, $to, $text)
	{
		global $iconv_path, $tmpfile;
		$p = popen($iconv_path." --from-code=".$from." --to-code=".$to." --output=".$tmpfile, "w");
		fwrite($p, $text);
		pclose($p);
		
		$fp = fopen($tmpfile, "r");
		$text = fread($fp, filesize($tmpfile));
		fclose($fp);
		
		return $text;
	}
}

괜찮기는 한데 $tmpfile 변수를 tempnam 함수를 사용해서 만드는 것이 더 좋아 보입니다. :)

- 토끼군

이한길의 이미지

tokigun wrote:

괜찮기는 한데 $tmpfile 변수를 tempnam 함수를 사용해서 만드는 것이 더 좋아 보입니다. :)

- 토끼군

저는 파일 하나만 그냥 쓸까 해서 그렇게 정한거에요..
여러 파일 만들어봐야.. 특별히 좋을일도 없을것 같고 해서요
/tmp디렉토리에다가도 만든 파일은 지워줘야 하는데
거 귀찮고 해서... 그렇게 했습니다.

여튼 아직 초보라...
뭐가 좋을지 모르겠습니다..

----
먼저 알게 된 것을 알려주는 것은 즐거운 일이다!
http://hangulee.springnote.com
http://hangulee.egloos.com

익명 사용자의 이미지

tmpfile을 하나만 만들경우, 동시에 두군데서 요청이 들어올 경우 충돌이 일어날 수 있습니다.

- 요청 1에서 tmpfile 생성
- 요청 2에서 tmpfile 생성 <- tmpfile을 덮어 써 버린다!
- 요청 1에서 tmpfile 읽기
- 요청 2에서 tmpfile 읽기

와 같은 순서로 실행될 수 있으며, 이 경우 요청 1에서도 요청 1의 결과물을 읽어들이게 됩니다.

익명 사용자의 이미지

위에 오타.
'요청 1에서도 요청 1의' -> '요청 1에서도 요청 2의'

ironiris의 이미지

output옵션을 주지않으면 stdout 으로 나오니 popen 을 r 로 열어서 그냥 읽어버리면 되지 않을까요?

익명 사용자의 이미지

혹시 dl 이 먹나 보시고
dl로 라이브러이 임포트해서 해보시는게 어떨까요?

송효진의 이미지

echo "유니코드" | iconv -f UTF-8 -t UHC

이런것도 됩니다.

shell_exec() 로 한방에...

정태영의 이미지

송효진 wrote:
echo "유니코드" | iconv -f UTF-8 -t UHC

이런것도 됩니다.

shell_exec() 로 한방에...

어짜피 파이프를 이용하는거라면 echo 부분은 popen 으로 연 파이프에.. fputs 등으로.. 밀어넣어주는게 더 효율적일 듯 하네요 ;)

오랫동안 꿈을 그리는 사람은 그 꿈을 닮아간다...

http://mytears.org ~(~_~)~
나 한줄기 바람처럼..

익명 사용자의 이미지

popen 함수는 단방향입니다.

echo 를 이용한 방법에는 길이 제한 있습니다.

정태영의 이미지

http://kr.php.net/manual/en/function.proc-open.php

그럼 양방향인 proc-open 을 사용하면 되겠네요 :)

오랫동안 꿈을 그리는 사람은 그 꿈을 닮아간다...

http://mytears.org ~(~_~)~
나 한줄기 바람처럼..

7339989b62a014c4ce6e31b3540bc7b5f06455024f22753f6235c935e8e5의 이미지

정태영 wrote:
http://kr.php.net/manual/en/function.proc-open.php

그럼 양방향인 proc-open 을 사용하면 되겠네요 :)

PHP 버전이.. :twisted:

이한길의 이미지

ditto wrote:
정태영 wrote:
http://kr.php.net/manual/en/function.proc-open.php

그럼 양방향인 proc-open 을 사용하면 되겠네요 :)

PHP 버전이.. :twisted:

지원되는 버젼이 다음과 같이 되어 있네요..

Quote:
PHP 4 >= 4.3.0, PHP 5

보통 다 그 버젼 쓰지 않나요?
제가 쓰는 나야나 계정은 4.3.1입니다..

아.. 그리고 좋은 방법을 알려주셔서 감사합니다..
조금더 봐야징~ 아직 초보라..ㅋ

----
먼저 알게 된 것을 알려주는 것은 즐거운 일이다!
http://hangulee.springnote.com
http://hangulee.egloos.com

이한길의 이미지

if(!function_exists(iconv))
{
	$p = popen("which iconv", "r");
	if($p)
	{
		$iconv_path = trim(fgets($p, 1024));
		fclose($p);
		
		$_checker = explode('/', $iconv_path);
		if(($_checker[count($_checker)-1])=="iconv")
		{
			function iconv($from, $to, $text)
			{
				global $iconv_path;
				
				$process = proc_open(
					$iconv_path." --from-code=".$from." --to-code=".$to,
					array(array("pipe", "r"),array("pipe", "w")),
					$pipes
				);
				
				fwrite($pipes[0],$text);
				fclose($pipes[0]);
				
				$result = '';
				while (!feof($pipes[1]))
					$result .= fgets($pipes[1], 024);
				fclose($pipes[1]);
				
				proc_close($process);
				
				return $result;
			}
		}
	}
}

고쳐봤습니다.. 이정도면 될런지...
이번엔 which를 사용해서 알아서 iconv를 찾게 했는데..
괜찮겠지요?

----
먼저 알게 된 것을 알려주는 것은 즐거운 일이다!
http://hangulee.springnote.com
http://hangulee.egloos.com

익명 사용자의 이미지

1. iconv의 위치는 자주 변하지 않는다
2. 웹 페이지 호출할 때마다 which를 실행하는 것은 낭비이다.

위의 두가지 사항을 고려해 볼 때 iconv의 위치를 지정하는 것은 예전처럼 변수 형태로 고정해서 지정하는 쪽이 더 나아보입니다.

익명 사용자의 이미지

이한길 wrote:
iconv는 인코딩을 변경해주는 훌륭한 툴입니다.
그리고 이것을 php에서도 iconv라는 함수를 사용해서
문자열의 인코딩을 변경할 수 있습니다..

다 아시는 이야기라.. 조금 죄송합니다..
글구 과연 팁에 올려도 될까 싶었지만..혹시나 싶어서..
올립니다.

아래는 그 함수를 사용할 수 없을 경우
하지만 서버에 iconv가 있는 경우 iconv바이너리 실행코드를 사용해서
php의 iconv()함수를 대신할 만한 간단한 코드입니다.

if(!function_exists(iconv))
{
	$tmpfile = $tmp_dir_path."/tmp001";
	$iconv_path = "/usr/bin/iconv";
	
	function iconv($from, $to, $text)
	{
		global $iconv_path, $tmpfile;
		$p = popen($iconv_path." --from-code=".$from." --to-code=".$to." --output=".$tmpfile, "w");
		fwrite($p, $text);
		pclose($p);
		
		$fp = fopen($tmpfile, "r");
		$text = fread($fp, filesize($tmpfile));
		fclose($fp);
		
		return $text;
	}
}

그냥

tar xvfpz php-version.tar.gz
cd php-version/ext/iconv
phpize
./conifgure
make
make install

해서 iconv extension 만 등록하는 것이 낳을 듯 싶은데요. 다만.. compiler 가 시스템에 없다면 문제이겠지만..

개인 적으로 iconv 명령을 이용할 것이라면 perl 의 piconv 를 이용하는 것이 낳다는 판단입니다. glibc 의 iconv 는 에러를 내며 뻗는 경우가 많은지라.. :-)

sisuc의 이미지

낳다는 아이를 낳다 새끼를 낳다 할때 쓰는 표현으로

A가 B보다 성능이 좋다라는 뜻을 표현할때는 낫다가 맞는 표현입니다.

위대한 한글

위대한 한글

김정균의 이미지

glibc의 iconv에서 뻗는 경우를 처리하려면, -c 옵션을 주시면 invalid 를 skip시킬 수 있습니다.

김정균의 이미지

뭐 EUC-KR(UHC) <-> UTF-8 만 고려하면 된다면.. http://cvs.oops.org/?cvsroot=PHP-Module&module=pear_KSC5601 이런 것도 있습니다. php native code로 되어 있습니다. :-) test 디렉토리에 보시면 예제가 있습니다.

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.