본문 바로가기

블로그 공학/단기 컨텐츠

euc_kr 에서 utf-8로 전환 정리

초기 조건은 mysql 3.23.55 또는 mysql 4.0.24 버전이었고

옮겨 가는 환경은 utf-8 , mysql 4.1.x,mysql 5.0.x  버전입니다.

 

 

1. 편집기

편집기는 아무거나 쓰지 마시고 저는 에디트플러스 2.31 을 사용하였습니다.

euc_kr 로 된 파일을 utf-8로 저장시 utf 식별자가 따라 붙기 때문에 메모장 등에서 파일을 저장하게 되면 화면 상단 또는 테이블과 테이블 사이에 빈공백이 생깁니다.

이와 같은 것을 BOM 이라고 하는데요. 이를 제거해 주기 위해서는 특수한 프로그램이 필요한 것입니다. 이클립스 등에서도 이를 제거해 줄 수 있는 기능이 있다고 하더군요.

에디티플러스에서는 2.31 버전에서 보면

도구 > 기본설정 > 파일 > 왼쪽화면에서 UTF-8 식별기호 설정란이 있습니다.

여기서 항상식별기호 제거를 선택하시면 됩니다.

 

2. jsp 페이지 수정

<%@ page language="java" contentType="text/html;charset=utf-8"  %>

화면 상단에 이와 같이 캐릭터셋을 지정해 주시면 되고요.

저장시 utf-8로 저장하시면 됩니다.

html 파일에서도 제대로 화면을 출력시켜 주기 위해서는 캐릭터셋을 지정해 주어야 하는 경우가 있더군요.

 

3. css, js 파일

이러한 파일은 그냥 utf-8 로 저장하시면 됩니다.

 

4. 한글파일 다운로드

파일이름을 넘겨주는 페이지는 utf-8 로 인코딩이 되어 있겠지만

파일이름을 받는 페이지는 반드시 utf-8 이 아닌 다른 캐릭터셋으로 지정해야 합니다.

이 때 utf-8 페이지에서 utf-8 이 아닌 페이지로 파일이름을 넘겨주게 되면

한글파일은 모두 깨지더군요.

그래서 파일이름을 직접 넘겨 주지 말고 테이블에 파일이름을 저장한 후에 파일번호만 넘겨 줍니다. 그러면 다운로드 페이지에서는 그 파일번호를 읽어와서

파일이름을 디비에서 가져오게 됩니다.

아래는 다른 분이 올려주신 소스를 약간 수정한 것입니다.

 

<%@ page contentType="text/html; charset=8859_1" import="java.io.*"%>
<jsp:useBean id="dbs" class="kr.pe.haedongmu.util.DBSql" scope="session" />
<%
 String b_fidx = request.getParameter("b_fidx");
 String filename = dbs.getSelectData("select b_fileinfo from bbs_finfo where b_fidx="+b_fidx); //파일 이름을 받는다.

 String path = getServletContext().getRealPath("/");
 String other_path="upload/board/";   // 경로 선택 가능하도록 변경. 오답노트 다운로드시와 게시판 다운로드시

 if(request.getParameter("pathflag") != null){
   other_path="upload/";
 }

 File file = new File(path+other_path+"/"+filename); // 절대경로입니다.

 response.setContentType("application/octet-stream"); 
 
 String Agent=request.getHeader("USER-AGENT");

 if(Agent.indexOf("MSIE")>=0){
  int i=Agent.indexOf('M',2);//두번째 'M'자가 있는 위치
  String IEV=Agent.substring(i+5,i+8);
  if(IEV.equalsIgnoreCase("5.5")){
   response.setHeader("Content-Disposition", "filename="+new String(filename.getBytes("euc-kr"),"8859_1"));
  }else{
   response.setHeader("Content-Disposition", "attachment;filename="+new String(filename.getBytes("euc-kr"),"8859_1")); 
  }
 }else{
   response.setHeader("Content-Disposition", "attachment;filename="+new String(filename.getBytes("euc-kr"),"8859_1"));
 }

 byte b[] = new byte[5 * 1024 * 1024];  //5M byte까지 업로드가 가능하므로 크기를 이렇게 잡아주었음.
 if (file.isFile()){  
  try { 
   BufferedInputStream fin = new BufferedInputStream(new FileInputStream(file));  
   BufferedOutputStream outs = new BufferedOutputStream(response.getOutputStream());  
   int read = 0;  
   while ((read = fin.read(b)) != -1){  
    outs.write(b,0,read);
   }
   outs.flush();
   outs.close();  
   fin.close(); 
  }catch(Exception e){}
 }

%>

5. 한글파일 업로드

업로드시에는 캐릭터셋을 utf-8로만 맞추어 주면 그냥 되더군요.

<%@ page language="java" contentType="text/html;charset=utf-8"  %>
<%@ page import="com.oreilly.servlet.MultipartRequest,com.oreilly.servlet.multipart.DefaultFileRenamePolicy,java.util.*"%>

 

MultipartRequest multi = new MultipartRequest(request, savePath, sizeLimit,"utf-8",
                           new DefaultFileRenamePolicy());

이렇게만 지정해 주시면 됩니다.

 

6. 마지막으로 가장 중요한 DB 세팅입니다.

1) 일단 mysql 4.1 이전 버전의 DB 에서 아무런 옵션도 주시 않고 덤프 받습니다.

mysqldump -hlocalhost -u아이디 -p비밀번호 디비이름 > 절대경로/파일이름.sql

 

2) 이 파일을 울트라에디트나 에디트플러스 등 대용량 파일을 편집할 수 있는 프로그램을 이용해서 엽니다.

 

-- MySQL dump 9.11
--
-- Host: localhost    Database: 디비명

-- ------------------------------------------------------
-- Server version 4.0.24_Debian-10sarge2-log

 

화면 맨위쪽을 보시면 위와 같이 되어 있습니다. 여기에 다음 세 줄을 덧붙입니다.

SET character_set_client = 'euckr';
SET character_set_results = 'euckr';
SET collation_connection = @@collation_database;

-- MySQL dump 9.11
--
-- Host: localhost    Database: 디비명

-- ------------------------------------------------------
-- Server version 4.0.24_Debian-10sarge2-log

 

그리고 나서 저장을 합니다.


 

3) mysql 4.1.x 버전을 설치하고 나서 my.ini 파일을 엽니다.

이 파일은 Windows 폴더 안에 있습니다.

맨 아랫쪽에 다음줄을 추가해 줍니다.

default-character-set=utf8

[mysqld]
init_connect=SET collation_connection = utf8_general_ci
init_connect=SET NAMES utf8
default-character-set=utf8
character-set-server=utf8
collation-server=utf8_general_ci

[mysql]
default-character-set=utf8

 

그리고 나서 mysql 을 재시동합니다.

 

mysql 5.0.x 버전부터는 캐릭터셋을 설치시 지정해 줄 수 있습니다.

거의 마지막 설치단계에 캐릭터셋을 지정해 주는 단계가 있습니다.

이 때 utf-8 로 지정해 주면 됩니다.

 

4) 이제 데이터베이스를 아래와 같이 생성합니다.

CREATE DATABASE 디비명 DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

 

5) 그런 후에 덤프 받은 파일을 리스토어 합니다.

mysql -hlocalhost -u아이디 -p패스워드 디비명 < 절대경로/파일이름.sql 

 

7. get으로 넘길 때 한글 검색 처리

넘기는 페이지에서

맨 위쪽에

<%@ page import="java.net.*"%> 을 추가하고

파라미터는 아래와 같이 처리합니다.

 

searchstring = URLEncoder.encode(searchstring,"UTF-8");

 

받는 페이지의 처리는 get 이든, post 이든 동일하게 처리해 주시면 됩니다.

str = new String(str.getBytes("ISO-8859-1"), "utf-8");

 

이상으로 euc_kr 에서 utf-8 환경으로 옮겨가는 전 과정을 서술하였습니다.