天天看点

文件上传在linux下乱码问题

乱码原因:上传文件的编码如果不是UTF8,读取到前台,与浏览器设置的编码(一般为UTF8)不一致,导致乱码

解决方案:在上传文件后,拿到服务器上的文件,然后以它自身编码读取文件内容,再以UTF8形式写入原文件(覆盖)

public static boolean writeUTF8ByFile(File file){

boolean flag = false;

String utf = txt2String(file);

OutputStreamWriter osw;

try {

osw = new OutputStreamWriter(new FileOutputStream(file),"UTF-8");

osw.write(utf);

osw.close();

flag = true;

} catch (UnsupportedEncodingException e) {

e.printStackTrace();

} catch (FileNotFoundException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

} 

return flag;

}

    private static String txt2String(File file){

        String result = "";

        try{

        // 如果文件的编码为windows-1252,则会产生乱码,需要重新设置为Unicode

String code = getFileCodeFormat(file);

logger.info("first code = " + code);

if(code.equals("windows-1252")) code = "Unicode";

 // 如果文件的编码为Big5,则会产生乱码,需要重新设置为GB18030

if(code.equals("Big5")) code = "GB18030";

logger.info("last code = " + code);

InputStreamReader isr = new InputStreamReader(new FileInputStream(

file), code);

            BufferedReader br = new BufferedReader(isr);//构造一个BufferedReader类来读取文件

            String s = null;

            while((s = br.readLine())!=null){//使用readLine方法,一次读一行

                result = result + "\r\n" +s;

            }

            br.close();    

        }catch(Exception e){

        logger.error(e.getMessage());

        }

        result = result.trim();

        logger.info("file content : " + result);

        return result;

    }

    

   

private static String getFileCodeFormat(File file) throws Exception{

 

CodepageDetectorProxy detector = CodepageDetectorProxy.getInstance();  

 

detector.add(new ParsingDetector(false));   

  

detector.add(JChardetFacade.getInstance());  

//ASCIIDetector用于ASCII编码测定  

detector.add(cpdetector.io.ASCIIDetector.getInstance());  

//UnicodeDetector用于Unicode家族编码的测定  

detector.add(cpdetector.io.UnicodeDetector.getInstance());  

java.nio.charset.Charset charset = null;  

try {  

     charset = detector.detectCodepage(file.toURL());  

} catch (Exception ex) {ex.printStackTrace();}  

if(charset!=null){  

   // System.out.println(file.getName()+"编码是:"+charset.name());  

}else { 

  // System.out.println(file.getName()+"未知");

}

return charset.name();

}

继续阅读