720
No
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();
//다운로드 횟수 증가 처리
}
댓글 ( 4)
댓글 남기기