java 文件输出 输入乱码,【Java基础专题】编码与乱码(04)---输出时的编码与乱码...

4f1150b881333f12a311ae9ef34da474.pngpackageexample.encoding;

4f1150b881333f12a311ae9ef34da474.png

4f1150b881333f12a311ae9ef34da474.pngimportjava.io.BufferedWriter;

4f1150b881333f12a311ae9ef34da474.pngimportjava.io.File;

4f1150b881333f12a311ae9ef34da474.pngimportjava.io.FileNotFoundException;

4f1150b881333f12a311ae9ef34da474.pngimportjava.io.FileOutputStream;

4f1150b881333f12a311ae9ef34da474.pngimportjava.io.FileWriter;

4f1150b881333f12a311ae9ef34da474.pngimportjava.io.IOException;

4f1150b881333f12a311ae9ef34da474.pngimportjava.io.OutputStreamWriter;

4f1150b881333f12a311ae9ef34da474.pngimportjava.io.PrintWriter;

4f1150b881333f12a311ae9ef34da474.pngimportjava.io.UnsupportedEncodingException;

4f1150b881333f12a311ae9ef34da474.pngimportjava.io.Writer;

4f1150b881333f12a311ae9ef34da474.pngimportjava.nio.charset.Charset;

4f1150b881333f12a311ae9ef34da474.pngimportjava.util.Iterator;

4f1150b881333f12a311ae9ef34da474.pngimportjava.util.Set;

4f1150b881333f12a311ae9ef34da474.pngimportjava.util.SortedMap;

4f1150b881333f12a311ae9ef34da474.png

1fa987a29c6482f53d401256f96355eb.png

ca75c07623e1b494fee67e8f316fc310.gif/** *//**d18c02628675d0a2c816449d98bda930.png * 

 
 

d18c02628675d0a2c816449d98bda930.png * The Class IOEncodeTest is a tester class for java encoding. Mainnaly contains

d18c02628675d0a2c816449d98bda930.png * two parts:

d18c02628675d0a2c816449d98bda930.png *  1.Test written by FileWriter, with or without given character encoding value

d18c02628675d0a2c816449d98bda930.png *  2.Test written by OutputStreamWriter, with or without given character encoding value

d18c02628675d0a2c816449d98bda930.png * 

d18c02628675d0a2c816449d98bda930.png * 

d18c02628675d0a2c816449d98bda930.png *@authorPaul Lin

d18c02628675d0a2c816449d98bda930.png *@version1.0

8f1ba5b45633e9678d1db480c16cae3f.png*/1fa987a29c6482f53d401256f96355eb.png

ca75c07623e1b494fee67e8f316fc310.gifpublicclassOutputEncodingTest9b8a8a44dd1c74ae49c20a7cd451974e.png{

d18c02628675d0a2c816449d98bda930.png

d18c02628675d0a2c816449d98bda930.pngprivatestaticString word="Hello world! 中国";

d18c02628675d0a2c816449d98bda930.png

d18c02628675d0a2c816449d98bda930.pngprivatestaticfinalString ENCODING_EN="ISO-8859-1";

d18c02628675d0a2c816449d98bda930.png

d18c02628675d0a2c816449d98bda930.pngprivatestaticfinalString ENCODING_CN="GB2312";

d18c02628675d0a2c816449d98bda930.png

d18c02628675d0a2c816449d98bda930.pngprivatestaticfinalString ENCODING_UTF="UTF-8";

d18c02628675d0a2c816449d98bda930.png

d18c02628675d0a2c816449d98bda930.pngprivatestaticfinalString DEFAULT_SYSTEM_ENCODING=System

d18c02628675d0a2c816449d98bda930.png            .getProperty("file.encoding");

d18c02628675d0a2c816449d98bda930.png

97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif/** *//**d18c02628675d0a2c816449d98bda930.png     * The main method.

d18c02628675d0a2c816449d98bda930.png     * 

d18c02628675d0a2c816449d98bda930.png     *@paramargs the arguments

ecedf933ec37d714bd4c2545da43add2.png*/97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gifpublicstaticvoidmain(String args[])9b8a8a44dd1c74ae49c20a7cd451974e.png{

d18c02628675d0a2c816449d98bda930.png        OutputEncodingTest tester=newOutputEncodingTest();

d18c02628675d0a2c816449d98bda930.png        tester.testFileWriter();

d18c02628675d0a2c816449d98bda930.png        tester.testOutputStreamWriter();

ecedf933ec37d714bd4c2545da43add2.png    }d18c02628675d0a2c816449d98bda930.png

97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif/** *//**d18c02628675d0a2c816449d98bda930.png     * Test file writer.

ecedf933ec37d714bd4c2545da43add2.png*/97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gifpublicvoidtestFileWriter()9b8a8a44dd1c74ae49c20a7cd451974e.png{

d18c02628675d0a2c816449d98bda930.png//Create test result folderd18c02628675d0a2c816449d98bda930.pngString resultFolder=createResultFolder(System

d18c02628675d0a2c816449d98bda930.png                .getProperty("user.language"), getBasePath());

d18c02628675d0a2c816449d98bda930.png//With default platform encodingd18c02628675d0a2c816449d98bda930.pngwriteByFileWriter(word, resultFolder);

d18c02628675d0a2c816449d98bda930.png//With given system file.encoding propertyd18c02628675d0a2c816449d98bda930.pngwriteByFileWriter(word, ENCODING_EN, resultFolder);

d18c02628675d0a2c816449d98bda930.png        writeByFileWriter(word, ENCODING_CN, resultFolder);

d18c02628675d0a2c816449d98bda930.png        writeByFileWriter(word, ENCODING_UTF, resultFolder);

ecedf933ec37d714bd4c2545da43add2.png    }d18c02628675d0a2c816449d98bda930.png

97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif/** *//**d18c02628675d0a2c816449d98bda930.png     * Test output stream writer.

ecedf933ec37d714bd4c2545da43add2.png*/97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gifpublicvoidtestOutputStreamWriter()9b8a8a44dd1c74ae49c20a7cd451974e.png{

d18c02628675d0a2c816449d98bda930.png//Create test result folderd18c02628675d0a2c816449d98bda930.pngString resultFolder=createResultFolder(System

d18c02628675d0a2c816449d98bda930.png                .getProperty("user.language"), getBasePath());

d18c02628675d0a2c816449d98bda930.png//With default platform encodingd18c02628675d0a2c816449d98bda930.pngwriteByOutputStreamWriter(word, resultFolder);

d18c02628675d0a2c816449d98bda930.png//With given system file.encoding propertyd18c02628675d0a2c816449d98bda930.pngwriteByOutputStreamWriter(word, ENCODING_EN, resultFolder);

d18c02628675d0a2c816449d98bda930.png        writeByOutputStreamWriter(word, ENCODING_CN, resultFolder);

d18c02628675d0a2c816449d98bda930.png        writeByOutputStreamWriter(word, ENCODING_UTF, resultFolder);

ecedf933ec37d714bd4c2545da43add2.png    }d18c02628675d0a2c816449d98bda930.png

97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif/** *//**d18c02628675d0a2c816449d98bda930.png     * Prints the available charset.

ecedf933ec37d714bd4c2545da43add2.png*/97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gifpublicvoidprintAvailableCharset()9b8a8a44dd1c74ae49c20a7cd451974e.png{

d18c02628675d0a2c816449d98bda930.png        SortedMapcharsets=Charset.availableCharsets();

d18c02628675d0a2c816449d98bda930.png        SetcharsetKeys=charsets.keySet();

d18c02628675d0a2c816449d98bda930.png        System.out.println("\n<<<+"Can encode >>>>\n");

d18c02628675d0a2c816449d98bda930.png

d18c02628675d0a2c816449d98bda930.png        Iteratori=charsetKeys.iterator();

97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gifwhile(i.hasNext())9b8a8a44dd1c74ae49c20a7cd451974e.png{

d18c02628675d0a2c816449d98bda930.png            String key=(String) i.next();

d18c02628675d0a2c816449d98bda930.png            Charset charset=(Charset) charsets.get(key);

d18c02628675d0a2c816449d98bda930.png            String displayName=charset.displayName();

d18c02628675d0a2c816449d98bda930.pngbooleancanEncode=charset.canEncode();

d18c02628675d0a2c816449d98bda930.png            System.out.println(key+"-"+displayName+"-"+canEncode);

ecedf933ec37d714bd4c2545da43add2.png        }ecedf933ec37d714bd4c2545da43add2.png    }d18c02628675d0a2c816449d98bda930.png

97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif/** *//**d18c02628675d0a2c816449d98bda930.png     * Write by file writer.

d18c02628675d0a2c816449d98bda930.png     * 

d18c02628675d0a2c816449d98bda930.png     *@paramcontent the content

ecedf933ec37d714bd4c2545da43add2.png*/97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gifprivatevoidwriteByFileWriter(String content, String destination)9b8a8a44dd1c74ae49c20a7cd451974e.png{

d18c02628675d0a2c816449d98bda930.png        String defaultEncoding=System.getProperty("file.encoding");

d18c02628675d0a2c816449d98bda930.png        System.out.println("Using default system encoding:"+defaultEncoding);

d18c02628675d0a2c816449d98bda930.png        writeByFileWriter(content, defaultEncoding, destination);

ecedf933ec37d714bd4c2545da43add2.png    }d18c02628675d0a2c816449d98bda930.png

97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif/** *//**d18c02628675d0a2c816449d98bda930.png     * Write by file writer.

d18c02628675d0a2c816449d98bda930.png     * 

d18c02628675d0a2c816449d98bda930.png     *@paramcontent the content

d18c02628675d0a2c816449d98bda930.png     *@paramencoding the encoding

ecedf933ec37d714bd4c2545da43add2.png*/d18c02628675d0a2c816449d98bda930.pngprivatevoidwriteByFileWriter(String content, String encoding,

97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif            String destination)9b8a8a44dd1c74ae49c20a7cd451974e.png{

d18c02628675d0a2c816449d98bda930.png        printDebugInformation("FileWriter", encoding, content);

d18c02628675d0a2c816449d98bda930.png

d18c02628675d0a2c816449d98bda930.png//Get system default encodingd18c02628675d0a2c816449d98bda930.pngString defaultEncoding=System.getProperty("file.encoding");

d18c02628675d0a2c816449d98bda930.png

d18c02628675d0a2c816449d98bda930.png//Reset underlying platform character encoding97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gifif(!defaultEncoding.equalsIgnoreCase(encoding))9b8a8a44dd1c74ae49c20a7cd451974e.png{

d18c02628675d0a2c816449d98bda930.png            System.setProperty("file.encoding", encoding);

ecedf933ec37d714bd4c2545da43add2.png        }d18c02628675d0a2c816449d98bda930.png

d18c02628675d0a2c816449d98bda930.png//Save as file with given encoding valued18c02628675d0a2c816449d98bda930.pngString file=returnFileName(destination,"write_by_filewriter_",

d18c02628675d0a2c816449d98bda930.png                encoding,".txt");

97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.giftry9b8a8a44dd1c74ae49c20a7cd451974e.png{

d18c02628675d0a2c816449d98bda930.png            Writer writer=newBufferedWriter(newFileWriter(file));

d18c02628675d0a2c816449d98bda930.png            writer.write(content);

d18c02628675d0a2c816449d98bda930.png            writer.flush();

d18c02628675d0a2c816449d98bda930.png            writer.close();

97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif        }catch(IOException ioe)9b8a8a44dd1c74ae49c20a7cd451974e.png{

d18c02628675d0a2c816449d98bda930.png            ioe.printStackTrace();

ecedf933ec37d714bd4c2545da43add2.png        }d18c02628675d0a2c816449d98bda930.png

d18c02628675d0a2c816449d98bda930.png//Reset character encoding to system default valued18c02628675d0a2c816449d98bda930.pngresetDefaultSystemEncoding();

ecedf933ec37d714bd4c2545da43add2.png    }d18c02628675d0a2c816449d98bda930.png

97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif/** *//**d18c02628675d0a2c816449d98bda930.png     * Write by output stream writer.

d18c02628675d0a2c816449d98bda930.png     * 

d18c02628675d0a2c816449d98bda930.png     *@paramcontent the content

ecedf933ec37d714bd4c2545da43add2.png*/97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gifprivatevoidwriteByOutputStreamWriter(String content, String destination)9b8a8a44dd1c74ae49c20a7cd451974e.png{

d18c02628675d0a2c816449d98bda930.png        String defaultEncoding=System.getProperty("file.encoding");

d18c02628675d0a2c816449d98bda930.png        System.out.println("Using default system encoding:"+defaultEncoding);

d18c02628675d0a2c816449d98bda930.png        writeByOutputStreamWriter(content, defaultEncoding, destination);

ecedf933ec37d714bd4c2545da43add2.png    }d18c02628675d0a2c816449d98bda930.png

97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif/** *//**d18c02628675d0a2c816449d98bda930.png     * Write by output stream writer.

d18c02628675d0a2c816449d98bda930.png     * 

d18c02628675d0a2c816449d98bda930.png     *@paramcontent the content

d18c02628675d0a2c816449d98bda930.png     *@paramencoding the encoding

ecedf933ec37d714bd4c2545da43add2.png*/d18c02628675d0a2c816449d98bda930.pngprivatevoidwriteByOutputStreamWriter(String content, String encoding,

97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif            String destination)9b8a8a44dd1c74ae49c20a7cd451974e.png{

d18c02628675d0a2c816449d98bda930.png        printDebugInformation("OutputStreamWriter", encoding, content);

d18c02628675d0a2c816449d98bda930.png

d18c02628675d0a2c816449d98bda930.png//Save as file with given encoding valued18c02628675d0a2c816449d98bda930.pngString file=returnFileName(destination,

d18c02628675d0a2c816449d98bda930.png"write_by_outputStreamWriter_", encoding,".txt");

97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.giftry9b8a8a44dd1c74ae49c20a7cd451974e.png{

d18c02628675d0a2c816449d98bda930.png            Writer writer=newPrintWriter(

d18c02628675d0a2c816449d98bda930.pngnewBufferedWriter(newOutputStreamWriter(

d18c02628675d0a2c816449d98bda930.pngnewFileOutputStream(file), encoding)));

d18c02628675d0a2c816449d98bda930.png            writer.write(content);

d18c02628675d0a2c816449d98bda930.png            writer.flush();

d18c02628675d0a2c816449d98bda930.png            writer.close();

97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif        }catch(FileNotFoundException fnfe)9b8a8a44dd1c74ae49c20a7cd451974e.png{

d18c02628675d0a2c816449d98bda930.png            fnfe.printStackTrace();

97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif        }catch(UnsupportedEncodingException uee)9b8a8a44dd1c74ae49c20a7cd451974e.png{

d18c02628675d0a2c816449d98bda930.png            uee.printStackTrace();

97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif        }catch(IOException ioe)9b8a8a44dd1c74ae49c20a7cd451974e.png{

d18c02628675d0a2c816449d98bda930.png            ioe.printStackTrace();

ecedf933ec37d714bd4c2545da43add2.png        }d18c02628675d0a2c816449d98bda930.png

d18c02628675d0a2c816449d98bda930.png//Reset character encoding to system default valued18c02628675d0a2c816449d98bda930.pngresetDefaultSystemEncoding();

ecedf933ec37d714bd4c2545da43add2.png    }d18c02628675d0a2c816449d98bda930.png

97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif/** *//**d18c02628675d0a2c816449d98bda930.png     * Gets the base path.

d18c02628675d0a2c816449d98bda930.png     * 

d18c02628675d0a2c816449d98bda930.png     *@returnthe base path

ecedf933ec37d714bd4c2545da43add2.png*/97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gifprivateString getBasePath()9b8a8a44dd1c74ae49c20a7cd451974e.png{

d18c02628675d0a2c816449d98bda930.png        StringBuffer finalPath=newStringBuffer();

d18c02628675d0a2c816449d98bda930.png        String dir=System.getProperty("user.dir");

d18c02628675d0a2c816449d98bda930.png

d18c02628675d0a2c816449d98bda930.png        finalPath.append(dir);

d18c02628675d0a2c816449d98bda930.png        finalPath.append((dir.endsWith("\\")||dir.endsWith("/"))?"":"/");

d18c02628675d0a2c816449d98bda930.png        finalPath.append("src").append("/");

d18c02628675d0a2c816449d98bda930.png        finalPath.append("example").append("/");

d18c02628675d0a2c816449d98bda930.png        finalPath.append("encoding").append("/");

d18c02628675d0a2c816449d98bda930.pngreturnfinalPath.toString();

ecedf933ec37d714bd4c2545da43add2.png    }d18c02628675d0a2c816449d98bda930.png

97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif/** *//**d18c02628675d0a2c816449d98bda930.png     * Return file name.

d18c02628675d0a2c816449d98bda930.png     * 

d18c02628675d0a2c816449d98bda930.png     *@parambasePath the base path

d18c02628675d0a2c816449d98bda930.png     *@paramprefix the prefix

d18c02628675d0a2c816449d98bda930.png     *@paramcontent the content

d18c02628675d0a2c816449d98bda930.png     *@paramsubfix the subfix

d18c02628675d0a2c816449d98bda930.png     * 

d18c02628675d0a2c816449d98bda930.png     *@returnthe string

ecedf933ec37d714bd4c2545da43add2.png*/d18c02628675d0a2c816449d98bda930.pngprivateString returnFileName(String basePath, String prefix,

97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif            String content, String subfix)9b8a8a44dd1c74ae49c20a7cd451974e.png{

d18c02628675d0a2c816449d98bda930.png        StringBuffer name=newStringBuffer(basePath);

97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gifif((!basePath.endsWith("\\")&&(!basePath.endsWith("/"))))9b8a8a44dd1c74ae49c20a7cd451974e.png{

d18c02628675d0a2c816449d98bda930.png            name.append("/");

ecedf933ec37d714bd4c2545da43add2.png        }d18c02628675d0a2c816449d98bda930.png        name.append(prefix);

d18c02628675d0a2c816449d98bda930.png        name.append(content);

d18c02628675d0a2c816449d98bda930.png        name.append(subfix);

d18c02628675d0a2c816449d98bda930.pngreturnname.toString();

ecedf933ec37d714bd4c2545da43add2.png    }d18c02628675d0a2c816449d98bda930.png

97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif/** *//**d18c02628675d0a2c816449d98bda930.png     * Creates the result folder.

d18c02628675d0a2c816449d98bda930.png     * 

d18c02628675d0a2c816449d98bda930.png     *@paramplatform the platform

d18c02628675d0a2c816449d98bda930.png     *@paramfullPath the full path

d18c02628675d0a2c816449d98bda930.png     * 

d18c02628675d0a2c816449d98bda930.png     *@returnthe string

ecedf933ec37d714bd4c2545da43add2.png*/97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gifprivateString createResultFolder(String platform, String fullPath)9b8a8a44dd1c74ae49c20a7cd451974e.png{

d18c02628675d0a2c816449d98bda930.png        StringBuffer resultFolder=newStringBuffer();

d18c02628675d0a2c816449d98bda930.png

97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gifif(fullPath.endsWith("\\")||fullPath.endsWith("/"))9b8a8a44dd1c74ae49c20a7cd451974e.png{

d18c02628675d0a2c816449d98bda930.png            resultFolder.append(fullPath);

97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif        }else9b8a8a44dd1c74ae49c20a7cd451974e.png{

d18c02628675d0a2c816449d98bda930.png            resultFolder.append(fullPath).append("/");

ecedf933ec37d714bd4c2545da43add2.png        }d18c02628675d0a2c816449d98bda930.png        resultFolder.append("Test_Result_Of_").append(platform);

d18c02628675d0a2c816449d98bda930.png

d18c02628675d0a2c816449d98bda930.png        File file=newFile(resultFolder.toString());

97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gifif(!file.exists())9b8a8a44dd1c74ae49c20a7cd451974e.png{

d18c02628675d0a2c816449d98bda930.png            file=newFile(resultFolder.toString());

d18c02628675d0a2c816449d98bda930.png            file.mkdir();

d18c02628675d0a2c816449d98bda930.pngreturnresultFolder.toString();

97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif        }else9b8a8a44dd1c74ae49c20a7cd451974e.png{

d18c02628675d0a2c816449d98bda930.pngreturnfile.getAbsolutePath();

ecedf933ec37d714bd4c2545da43add2.png        }ecedf933ec37d714bd4c2545da43add2.png    }d18c02628675d0a2c816449d98bda930.png

97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif/** *//**d18c02628675d0a2c816449d98bda930.png     * Prints the debug information.

d18c02628675d0a2c816449d98bda930.png     * 

d18c02628675d0a2c816449d98bda930.png     *@paramwriterName the writer name

d18c02628675d0a2c816449d98bda930.png     *@paramencoding the encoding

ecedf933ec37d714bd4c2545da43add2.png*/d18c02628675d0a2c816449d98bda930.pngprivatevoidprintDebugInformation(String writerName, String encoding,

97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif            String content)9b8a8a44dd1c74ae49c20a7cd451974e.png{

d18c02628675d0a2c816449d98bda930.png        StringBuffer msg=newStringBuffer();

d18c02628675d0a2c816449d98bda930.png        msg.append("\n<<<

d18c02628675d0a2c816449d98bda930.png        msg.append("Test written by").append(writerName);

d18c02628675d0a2c816449d98bda930.png        msg.append("with encoding").append(encoding);

d18c02628675d0a2c816449d98bda930.png        msg.append("---------------------------------->>>>\n");

d18c02628675d0a2c816449d98bda930.png        msg.append("\nOriginal string:").append(content).append("\n");

d18c02628675d0a2c816449d98bda930.png        System.out.println(msg.toString());

ecedf933ec37d714bd4c2545da43add2.png    }d18c02628675d0a2c816449d98bda930.png

97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif/** *//**d18c02628675d0a2c816449d98bda930.png     * Reset default system encoding.

ecedf933ec37d714bd4c2545da43add2.png*/97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gifprivatevoidresetDefaultSystemEncoding()9b8a8a44dd1c74ae49c20a7cd451974e.png{

d18c02628675d0a2c816449d98bda930.png        System.setProperty("file.encoding", DEFAULT_SYSTEM_ENCODING);

ecedf933ec37d714bd4c2545da43add2.png    }8f1ba5b45633e9678d1db480c16cae3f.png}

【1】中文平台情况下,测试结果如下:

1.如果采用FileWriter,并指定GBK编码:编码后字符长度为15,可以正常保存和读取

2.如果采用FileWriter,并指定UTF-8编码:编码后字节长度为16,可以正常保存和读取

3.如果采用FileWriter,并指定ISO8859-1编码:编码后字节长度为17,可以正常保存和读取

4.如果采用OutputStreamWriter,并指定GBK编码:编码后字符长度为15,可以正常保存和读取

5.如果采用OutputStreamWriter,并指定UTF-8编码:编码后字节长度为16,可以正常保存和读取

6.如果采用OutputStreamWriter,并指定ISO-8859-1编码:编码后字节长度为17,变成?

【2】英文平台情况下,测试结果如下:

1.如果采用FileWriter,并指定GBK编码:编码后字符长度为15,变成?

2.如果采用FileWriter,并指定UTF-8编码:编码后字节长度为16,变成?

3.如果采用FileWriter,并指定ISO-8859-1编码:编码后字节长度为17,变成?

4.如果采用OutputStreamWriter,并指定GBK编码:编码后字符长度为15,可以正常保存和读取

5.如果采用OutputStreamWriter,并指定UTF-8编码:编码后字节长度为16,可以正常保存和读取

6.如果采用OutputStreamWriter,并指定ISO-8859-1编码:编码后字节长度为17,变成?

【结论】

①在中文平台下,如果使用FileWriter,不论你如何设置字符集都不会起作用。因为它采用的是默认的系统字符集。即便你设置了System.setProperty("file.encoding", "ISO-8859-1"),或者在运行时给予参数-Dfile.encoding=UTF-8都不会起作用。你会发现它最终还是都已"GB2312"或者"GBK"的方式保存。

在中文平台下,如果使用OutputStreamWriter,则在后台写入时会把字符流转换成字节流,此时指定的编码字符集就起作用了。可以看到在指定GBK、UTF-8的情况下中文可以正常的保存和读取,同时文件按照我们给定的方式保存了。而对于ISO-8859-1则变成了?,这再次证明了采用ISO-8859-1是不能保存中文的,而且会因为中文编码在ISO-8859-1的编码中找不到对应的字符而默认转换成?。

②在英文平台下,如果使用FileWriter,不论你如何设置字符集同样都不会起作用。所有的文件都将按照ISO-8859-1的编码方式保存,毫无疑问地变成了?。在英文平台下,如果使用OutputStreamWriter,则只有当我们把字符和文件的编码方式正确设置为GBK、UTF-8的情况下,中文才能正确的保存并显示。

③通过上述的实验证明,为了确保在不同的平台下,客户端输入的中文可以被正确地解析、保存、读取。最好的办法就是使用OutputStreamWriter配合UTF-8编码。

如果不想使用UTF-8编码,那么可以考虑使用GB2312,不建议使用GBK、GB18030。因为对于某些老式的文本编辑器,甚至不支持GBK、GB18030的编码,但是对于GB2312则是一定支持的。因为前两者都不是国标但后者是。

④关于String的getBytes(),getBytes(encoding)和new String(bytes, encoding)这三个方法,非常值得注意:

A.getBytes():使用平台默认的编码方式(通过file.encoding属性获取)方式来将字符串转换成byte[]。得到的是字符串最原始的字节编码值。

B.getBytes(NAME_OF_CHARSET):使用指定的编码方式将字符串转换成byte[],如果想要得到正确的字节数组,程序员必须给出正确的NAME_OF_CHARSET。否则得到的就不会得到正确的结果。

C.new String(bytes, encoding):如果我们在客户端使用UTF-8编码的JSP页面发出请求,浏览器编码后的UTF-8字节会以ISO-8859-1的形式传递到服务器端。所以要得到经HTTP协议传输的原始字节,我们需要先调用getBytes("ISO-8859-1")得到原始的字节,但由于我们客户端的原始编码是UTF-8,如果继续按照ISO-8859-1解码,那么得到的将不是一个中文字符,而是3个乱码的字符。所以我们需要再次调用new String(bytes,"UTF-8"),将字节数组按照UTF-8的格式,每3个一组进行解码,才能还原为客户端的原始字符。

D.String的getBytes()、getBytes(NAME_OF_CHARSET)方法都是比较微妙的方法,原则上:传输时采用的是什么编码,我们就需要按照这种编码得到字节。new String(bytes, NAME_OF_CHARSET)则更加需要小心,原则上:客户端采用的是什么编码,那么这里的NAME_OF_CHARSET就必须和客户端保持一致。

例如JSP页面是GBK,那么我们接收页面传递而来的参数时就必须使用new String(parameter.getBytes("ISO-8859-1"), "GBK");如果使用了错误的解码方式,如使用了UTF-8,那么得到的很有可能就是乱码了。

也就是说:GBK--->ISO-8859-1--->GBK、UTF-8--->ISO-8859-1--->UTF-8的转换过程是没有问题的。但是GBK--->ISO-8859-1--->UTF-8、UTF-8--->ISO-8859-1--->GBK的字节直接转码则可能导致乱码,需要另外的转换过程。

记住:

谨慎地使用getBytes(NAME_OF_CHARSET)和new String(bytes, NAME_OF_CHARSET),除非你很清楚的知道原始的字符编码和传输协议使用的编码。

推荐使用基于服务器的配置、过滤器设置request/response的characterEncoding、content type属性。还有就是JSP页面的pageEncoding属性、HTML meta元素的content type属性。尽量避免频繁的在代码中进行字符串转码,即降低了效率又增加了风险

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值