csv 일본어 코드 문제 해결

7884 단어 자바
중국어 로 CSV 파일 내 보 내기 문제 해결
일반적인 인 코딩 과 인 코딩 헤드 BOM:https://www.cnblogs.com/signheart/p/c3b1000186199e89d4e02c33f39ed418.html
난 코드 문 제 는 매우 골 치 아 프 고,일본어 의 난 코드 문 제 는 더욱 골 치 아프다.상식 적 으로 일본 인 들 이 장인 정신 에 비해하지만 결 과 는 놀 라 웠 다.일본어 에 어 지 러 운 문 제 를 검색 한 결과 영어 와 중국어 가 가장 많이 나 왔 고 마지막 으로 일본어 가 나 왔 다.일본어 의 글 을 열 어 보 니 크게 놀 랐 다.가장 기본 적 인 테스트 사례 인 COPY 는 끝 난 셈 이 고 그들의 민족 정신 에 전혀 떳떳 하지 못 하 다.다시 돌 이 켜 보면 문 제 는 일본어 로 CSV 를 내 보 내 는 데 두 가지 문제 가 해결 되 어야 합 니 다.
  • 일본어,중국어 난호;
  • 쉼표 구분자 가 효력 을 잃 었 습 니 다.모든 내용 이 한 줄 에 있 습 니 다.
  • 상기 두 가지 문제 에 대해 모두 문자 집합 문제 로 돌 립 니 다.문자 집합 문 제 를 해결 하고 이상 의 문 제 는 쉽게 해결 되 었 습 니 다.또 다른 문 제 는 UTF-8 시 BOM 도입 이다.자,여기 서 BOM 의 지식 을 보충 해 드 리 겠 습 니 다.
  • BOM(영어:byte-order mark)바이트 순서 표시:코드 점 U+FEFF 에 있 는 통일 코드 문자 의 이름 입 니 다.UCS/통일 코드 문자 로 구 성 된 문자열 을 UTF-16 또는 UTF-32 로 인 코딩 할 때 이 문 자 는 바이트 순 서 를 표시 하 는 데 사 용 됩 니 다.그것 은 UTF-8,UTF-16 또는 UTF-32 인 코딩 의 기호 로 자주 사용 된다.BOM 도 유 니 코드 표준 의 일부분 으로 특정한 적용 범위 가 있다.일반적으로 BOM 은 유 니 코드 의 순수한 텍스트 바이트 흐름 을 표시 하 는 데 사용 되 며,텍스트 처리 프로그램 이 읽 은.txt 파일 이 어떤 유 니 코드 인 코딩(UTF-8,UTF-16BE,UTF-16LE)인지 식별 할 수 있 는 편리 한 방법 을 제공 합 니 다.윈도 우즈 가 BOM 처리 에 상대 적 으로 좋 은 이 유 는 윈도 우즈 가 유 니 코드 식별 코드 를 API 에 집 적 했 기 때문에 주로 Create File()이다.텍스트 파일 을 열 때 자동 으로 BOM 을 인식 하고 제거 합 니 다.윈도 가 이 걸 사용 한 것 은 역사적 인 이유 가 있다.왜냐하면 그것 은 최초 로 여러 코드 페이지 의 환경 에서 탈 태 했 기 때문이다.유 니 코드 를 도입 할 때 윈도 의 디자이너 는 사용자 가 주의 하지 않 는 상황 에서 유 니 코드 와 비 유 니 코드(Multiple byte)텍스트 파일 을 동시에 호 환 할 수 있 기 를 원 하기 때문에 이런 작은 trick 를 빌 릴 수 밖 에 없다.이에 비해 리 눅 스 와 같은 시스템 은 다 중 locale 환경 에서 물 든 시간 이 비교적 짧 은 데다 가 지역사회 자체 도 충분 한 동력 을 가지 고 가 벼 운 옷차림 으로 전진 할 수 있다.그 러 니까 차라리 한 걸음 에 UTF-8 로 들 어가.

  • 구체 적 인 실현 은 코드 를 봅 시다.
    package com.yneit.test;
    
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.OutputStreamWriter;
    import java.nio.charset.Charset;
    import java.util.Arrays;
    import java.util.Calendar;
    import java.util.GregorianCalendar;
    import java.util.List;
    
    import org.springframework.util.NumberUtils;
    import org.supercsv.cellprocessor.FmtBool;
    import org.supercsv.cellprocessor.FmtDate;
    import org.supercsv.cellprocessor.constraint.LMinMax;
    import org.supercsv.cellprocessor.constraint.NotNull;
    import org.supercsv.cellprocessor.constraint.UniqueHashCode;
    import org.supercsv.cellprocessor.ift.CellProcessor;
    import org.supercsv.io.CsvListWriter;
    import org.supercsv.io.ICsvListWriter;
    import org.supercsv.prefs.CsvPreference;
    
    import au.com.bytecode.opencsv.CSVWriter;
    
    /**
     * CSV       
     */
    public class Test {
    
        //        
        public static String UTF_16LE = "UTF-16LE";
        public static String UTF_8 = "UTF-8";
    
        public static void main(String[] args) throws IOException {
            String path = "G:\\Project_Java\\MyProject\\src\\com\\yneit\\work\\test.csv";
            String encoder = UTF_8;
    
            OutputStreamWriter out = new OutputStreamWriter(new FileOutputStream(path), encoder);
            out.write(0xFEFF);
            CSVWriter writer = new CSVWriter(out, CSVWriter.DEFAULT_SEPARATOR,
                    CSVWriter.NO_QUOTE_CHARACTER, CSVWriter.NO_ESCAPE_CHARACTER,
                    CSVWriter.DEFAULT_LINE_END);
    
            String[] entries = { "1", "fir", "リージョン", "6", "  ", "ond,  \"ird" };
            String[] datas = new String[entries.length];
            for (int i = 0; i < entries.length; i++) {
                String item = Test.verityCell(entries[i]);
                datas[i] = item;
            }
    
            writer.writeNext(datas);
            writer.close();
    
            System.out.println("over");
    
            try {
                Test.writeWithCsvListWriter();
            }
            catch (Exception e) {
                e.printStackTrace();
            }
        }
    
        /**
         * @return the cell processors
         */
        private static CellProcessor[] getProcessors() {
    
            final CellProcessor[] processors = new CellProcessor[] { new UniqueHashCode(), // customerNo
                                                                                            // (must
                                                                                            // be
                                                                                            // unique)
                    new NotNull(), // firstName
                    new NotNull(), // lastName
                    new FmtDate("dd/MM/yyyy"), // birthDate
                    new NotNull(), // mailingAddress
                    new Optional(new FmtBool("Y", "N")), // married
                    new Optional(), // numberOfKids
                    new NotNull(), // favouriteQuote
                    new NotNull(), // email
                    new LMinMax(0L, LMinMax.MAX_LONG) // loyaltyPoints
            };
    
            return processors;
        }
    
        /**
         * An example of reading using CsvListWriter.
         */
        private static void writeWithCsvListWriter() throws Exception {
    
            // create the customer Lists (CsvListWriter also accepts arrays!)
            final List john = Arrays.asList(new Object[] { "1", "リージョン", "リー",
                    new GregorianCalendar(1945, Calendar.JUNE, 13).getTime(),
                    "1600 リー Parkway
    z View, CA 94043
    United States", null, null, "\"May the Force リー with you.\" - Star Wars", "[email protected]", 0L }); final List bob = Arrays.asList(new Object[] { "2", "Bob", "Down", new GregorianCalendar(1919, Calendar.FEBRUARY, 25).getTime(), "1601 Willow Rd.
    リー Park, CA 94025
    United States", true, 0, "\"Frankly, my dear, I don't give a damn.\" - Gone With The Wind", " @hotmail.com", 123456L }); ICsvListWriter listWriter = null; try { OutputStreamWriter out = new OutputStreamWriter(new FileOutputStream( "G:\\Project_Java\\MyProject\\src\\com\\yneit\\work\\writeWithCsvListWriter.csv"), Charset.forName(UTF_8)); out.write('\uFEFF'); listWriter = new CsvListWriter(out, CsvPreference.STANDARD_PREFERENCE); final CellProcessor[] processors = Test.getProcessors(); final String[] header = new String[] { "customerNo", "firstName", "lastName", "birthDate", "mailingAddress", "married", "numberOfKids", "favouriteQuote", "email", "loyaltyPoints" }; // write the header listWriter.writeHeader(header); // write the customer lists listWriter.write(john, processors); listWriter.write(bob, processors); } finally { if (listWriter != null) { listWriter.close(); } } } public static String verityCell(String content) { if (content == null) { return ""; } if (NumberUtils.isNumber(content) && content.length() > 0) { content = "\t" + content; } if (content.indexOf(CSVWriter.DEFAULT_QUOTE_CHARACTER) > -1 || content.indexOf(CSVWriter.DEFAULT_SEPARATOR) > -1) { content = StringUtils.replace(content, String.valueOf(CSVWriter.DEFAULT_QUOTE_CHARACTER), "" + CSVWriter.DEFAULT_QUOTE_CHARACTER + CSVWriter.DEFAULT_QUOTE_CHARACTER); content = CSVWriter.DEFAULT_QUOTE_CHARACTER + content + CSVWriter.DEFAULT_QUOTE_CHARACTER; } else { content = CSVWriter.DEFAULT_QUOTE_CHARACTER + content + CSVWriter.DEFAULT_QUOTE_CHARACTER; } return content; } }

    좋은 웹페이지 즐겨찾기