관리 메뉴

엉망진창

utf-8 로 이전하기 본문

Study_Web/PHP

utf-8 로 이전하기

엉망진창 2009. 1. 30. 18:26

출처 : PHPSCHOOL

utf-8 로 이전하기.

1. MySQL

-- 5.x --
- euckr 스키마 백업
mysqldump --all-databases --no-data --default-character-set=euckr -p > backup.scheme.sql

- euckr 자료 백업
mysqldump --all-databases --no-create-db --no-create-info --default-character-set=euckr -p > backup.data.sql

웬만하면 사용자계정 정보는 암호까지 확실하게 알고있자.
GRANT ALL 쿼리문을 직접 작성하여 가지고 있자.

- UTF-8 을 제대로 지원하기 위해 버전을 5.x 로 올린다.
(varchar(1) 은 1byte 가 아닌 한글자를 의미하게 된다.
set names 만으로 클라이언트의 캐릭터셋을 맞출 수 있다.)
= backup.scheme.sql =
테이블 중 BLOB 형식이나 BINARY 속성 필드에 문자열이 들어가는 곳이 있다면,
TEXT 형식으로 바꾸거나 BINARY 속성을 없앤다.
DEFAULT '0' 같은 잘못된 따옴표를 고친다.
TYPE=MyISAM 같은건 ENGINE=MyISAM 으로 수정한다.
맨 위쪽의 SET NAMES euckr 을 제외한 모든 CHARACTER SET 의 euckr 을 utf8 로 수정한다.

cat backup.scheme.sql | mysql -p --default-character-set=utf8
mysql 설정이 utf8 기준이고, sql 문에 SET NAMES euckr 이 들어있다.
즉, 생성은 utf8 로 되지만, 데이터가 euckr 이라는것을 알고 있으므로,
자동으로 변환되어 들어간다.
이는 iconv 를 이용한 변환보다 안전하다.
(MySQL 의 옛날 버전은 멀쩡한 한글조차 escape 시켜 놓는 경우가 있다.)

= backup.data.sql =
cat backup.data.sql | mysql -p --default-character-set=utf8

- 사용자계정을 GRANT ALL 문으로 다시 만들어준다.
root 지워버리지 않게 주의.


-- old --
이전 MySQL 에 charset 관련 옵션이 없다면,
스키마는
cat backup.scheme.sql | mysql -p --default-character-set=utf8
데이터는
cat backup.data.sql | mysql -p --default-character-set=euckr
로 복구하면 된다.

스키마는 꼭 꼼꼼히 살펴보고 편집하자.
스키마에 한글로 된 주석 같은것이 있다면,
지워버리는것이 속 편하지만,
살리고자 한다면, 편집이 필요하다.
backup.scheme.sql 을 열고 맨 위에
SET NAMES euckr; 을 적어주자.
다른 줄에 SET NAMES 가 없어야 한다.
그리고 CREATE DATABASE, CREATE TABLE 문에 일일히 CHARACTER SET utf8;
을 붙여주자.
편집시 편집기에 의해 캐릭터 셋이 변경되지 않도록,
별 기능 없는 편집기를 이용하자.

2. 파일
모든 파일의 내용을 utf8 로 바꾸자.
조건에 따라 동작이 달라지므로 php 를 이용하자.
/toutf.php
<?php

$f = $_SERVER['argv'][1];
if(!file_exists($f)) {
    echo $f." file not found.\n";
}

$text = file_get_contents($f);
$text8 = @iconv('CP949', 'UTF-8//IGNORE', $text);

$cnt = strlen($text);
$cnt8 = strlen($text8);
if($cnt <= $cnt8) {
    // 제대로 변경이 되었다면 용량이 커졌을 것이다.
    // 용량이 같다면 한글이 없는 것이다.
    rename($f, $f.'.euckr'); // 백업
    file_put_contents($f, preg_replace('/charset=euc-kr/i', 'charset=utf-8', $text8));
    echo $f." file is converted.\n";
} else {
    // 용량이 작아진다면 잘못된 것이다.
    $fp = fopen('/error.txt', 'a');
    fwrite($fp, $f."\n");
    fclose($fp);
}

?>

find /home -type f -name "*.php" -exec php /toutf.php "{}" \;
find /home -type f -name "*.inc" -exec php /toutf.php "{}" \;
find /home -type f -name "*.txt" -exec php /toutf.php "{}" \;
find /home -type f -name "*.html" -exec php /toutf.php "{}" \;
find /home -type f -name "*.htm" -exec php /toutf.php "{}" \;
find /home -type f -name "*.js" -exec php /toutf.php "{}" \;
find /home -type f -name "*.css" -exec php /toutf.php "{}" \;


현재 UTF-8 이 아닌 곳이 없기 때문에,
기억을 더듬어 대충 만들었다.
적용전 백업은 필수다.

에디터는 EmEditor, DreamWeaver CS3 를 추천한다.
FTP 는 WinSCP 4 를 추천한다. 윈도 커멘더 모드로 하면 파일명이 지X 같아도 잘 올리고 받아질 것이다.

WinSCP 의 에디터로 EmEditor 를 설정하면 무적이다.
EmEditor 는 기능이 조금 제한된 free 버전이 있다.