JSP

CharsetDetector 

 

 

package common;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.nio.ByteBuffer;
import java.nio.charset.CharacterCodingException;
import java.nio.charset.Charset;
import java.nio.charset.CharsetDecoder;

public class CharsetDetector {
	//String[] charsetsToBeTested = { "utf-8", "euc-kr" };

	String[] charsetsToBeTested = { "MS949", "KSC5601", "EUC-KR", "x-windows-949", "UTF-8", "iso-8859-1"};
	
	public Charset detectCharset(File f) {

		Charset charset = null;

		for (String charsetName : charsetsToBeTested) {
			charset = detectCharset(f, Charset.forName(charsetName));
			if (charset != null) {
				break;
			}
		}

		return charset;
	}

	private Charset detectCharset(File f, Charset charset) {
		try {
			BufferedInputStream input = new BufferedInputStream(new FileInputStream(f));

			CharsetDecoder decoder = charset.newDecoder();
			decoder.reset();

			byte[] buffer = new byte[512];
			boolean identified = false;
			while ((input.read(buffer) != -1) && (!identified)) {
				identified = identify(buffer, decoder);
			}

			input.close();
//			if (identified) {
//				return charset;
//			} else {
//				return null;
//			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return charset;
	}

	private boolean identify(byte[] bytes, CharsetDecoder decoder) {
		try {
			decoder.decode(ByteBuffer.wrap(bytes));
		} catch (CharacterCodingException e) {
			return false;
		}
		return true;
	}

	public static void main(String[] args) {
		CharsetDetector cd = new CharsetDetector();
		File file = new File("D:\\work\\web03\\src\\common\\테스트.txt");
		Charset charset = cd.detectCharset(file);
		System.out.println(charset);
	}
}

 

			//<한글 깨짐 설정>
			//첨부파일에 특수문자, 한글이 포함될 경우의 처리
			//스트링.getBytes("문자셋") 스트링을 바이트 배열로 변환
			//new String(바이트배열, "문자셋") 바이트배열을 스틍링으로
			//8859_1 (iso-8859-1 서유럽언어 문자셋)
			
			//1. 간단한 방법 그러나 근본적인 해결책이 아니다.
			
			//filename=new String(filename.getBytes("utf-8"), "8859_1");
			
			//
			//2. 파일의 인코딩을 검사해서 지정
			//http://blog.kjslab.com/5
			CharsetDetector cd =new CharsetDetector();
			File file=new File(path);
			Charset charset=cd.detectCharset(file);
			filename=new String(filename.getBytes(charset), "8859_1");
			

 

 

 if(url.indexOf("download.do")!=-1){
			//게시물 번호
			int num=Integer.parseInt(request.getParameter("num"));
			//게시물 번호에 해당하는 첨부파일 이름 조회
			String filename=dao.getFileName(num);
			//서버의 파일을 읽어서 클라이언트로 복사
			String path =Constant.uplLoadPath(request)+File.separator+filename;
			//서버에 있는 파일 읽어오기
			byte b[] =new byte[4096];//바이트 배열
			FileInputStream fis=new FileInputStream(path);
			
			//마임타입(파일의 종료)
			String mimeType
			 =getServletContext().getMimeType(path);
			if(mimeType==null){
				mimeType
				="application/octet-stream;charset=utf-8";
			}
			//<한글 깨짐 설정>
			//첨부파일에 특수문자, 한글이 포함될 경우의 처리
			//스트링.getBytes("문자셋") 스트링을 바이트 배열로 변환
			//new String(바이트배열, "문자셋") 바이트배열을 스틍링으로
			//8859_1 (iso-8859-1 서유럽언어 문자셋)
			
			//1. 간단한 방법 그러나 근본적인 해결책이 아니다.
			
			//filename=new String(filename.getBytes("utf-8"), "8859_1");
			
			//
			//2. 파일의 인코딩을 검사해서 지정
			//http://blog.kjslab.com/5
			CharsetDetector cd =new CharsetDetector();
			File file=new File(path);
			Charset charset=cd.detectCharset(file);
			filename=new String(filename.getBytes(charset), "8859_1");
			
			//헤더 구성(첨부파일의 정보)
			response.setHeader("Content-Disposition", 
					"attachment;filename="+filename);
			
			//파일 출력
			ServletOutputStream out=
					response.getOutputStream();
			
			//파일 가져오기 및 출력 작업
			int numRead;
			while(true){
				//서버에서 읽음
				numRead=fis.read(b, 0, b.length);
				//더 이상 읽을 내용이 없으면 
				if(numRead==-1)break;
				//클라이언트로 복사
				out.write(b,0, numRead);
			}
			//리소스 정리
			out.flush();
			out.close();
			fis.close();
			//다운로드 횟수 증가 처리
			
			
		}

 

 

 

 

 

 

 

 

about author

PHRASE

Level 60  머나먼나라

대추나무에 연 걸리듯 , 여기저기에 빛이 많이 걸려 있음을 비유하여 이르는 말.

댓글 ( 4)

댓글 남기기

작성