CSV 파일을 Excel로 여는 퀴즈 문제

3075 단어
이 글은 일정한 인코딩 기초가 있는 사람에게 적합하다. 순수하게 수동으로 디코딩 문제를 해결하는 것은 다음과 같다.
코드를 바꾸어 저장한 후 다시 열면 됩니다.디코딩 작업은 다음과 같습니다. 편집기 -> 다른 이름으로 저장 -> ASCII 코드 형식 파일/UTF-8에는 BOM 형식 -> 저장이 있습니다.
참고 자료:https://blog.csdn.net/m0_37125796/article/details/73928157
CSV 파일의 데이터 목록을 썼는데 Excel로 열어보니 모든 코드가 엉망진창이었어요.
그래서 위의 이 문장을 찾았고 그의 방식을 참조하여 약간의 수정을 하여 마침내 이 문제를 해결했다.

해결 방법: CSV 파일에 BOM 헤드 추가


BOM이란 무엇입니까?
간단하게 말하자면, 그것은 내용이 어떤 인코딩 형식으로 존재하는지 증명할 수 있는 중간자이다.
Excel은 ASCII 코드 형식 파일이고 CSV 파일은 UTF-8 형식입니다.만약 호환되지 않는다면, 이 두 가지 다른 형식은 틀림없이 정상적으로 전시할 수 없을 것이다.
그래서 나는 UTF-8 인코딩된 CSV 파일에 UTF-8의 BOM 헤더를 써서 엑셀에게 "나는 UTF-8 인코딩한 것이니 너는 나의 인코딩 형식에 따라 해석해야 한다."라고 알려야 한다.이렇게 해야만 Excel이 진정으로 서류의 내용을 똑똑히 인식할 수 있다.
위의 참고 자료는 다음과 같은 해결 방안을 제시합니다.
OutputStreamWriter osw = new OutputStreamWriter(resp.getOutputStream(), "UTF-8");  
//    
result = (String)contentMap.get(RESPONSE_RESULT);  
resp.setHeader("Content-Disposition", "attachment;filename=test.csv");  
osw.write(new String(new byte[] { (byte) 0xEF, (byte) 0xBB,(byte) 0xBF }));  
osw.write(result);  
osw.flush();  

나는 기뻐서 모호하게 내 코드를 그처럼 만들었고, 내 맥 컴퓨터에서 이미 실행에 성공했으며, 엑셀은 나의 CSV 파일을 정상적으로 열 수 있다.
그래서 나는 기쁘게 물건을 인도하여 나의 완제품을 맏형에게 보내서 검열하게 했다.
누가 알겠는가, 맏형이 내게 준 답은 "열어도 엉망이야."였다.
"그럴 리가요. 제 컴퓨터에서 열 수 있어요!"나는 무의식적으로 한마디 반박했는데, 나중에 생각해 보니 정말 어리석다. 설마 맏형이 나를 속인 건 아니겠지, 빨리 코드를 검사하지 않겠니!
나는 의문을 가지고 맏형도 와서 나에게 어디에 문제가 있는지 보여 주었다. 먼저 내가 수정하기 전의 코드를 한 단락만 올라가자.
            FileOutputStream fos = new FileOutputStream(file);
            OutputStreamWriter osw = new OutputStreamWriter(fos);
            osw.write(new String(new byte[] { (byte) 0xEF, (byte) 0xBB, (byte) 0xBF }));
            osw.write(s);
            osw.flush();

나는 참고한 문장에 따라 이 코드를 썼는데, 보기에 아무런 문제가 없는 것 같다.그러나 맏형은 고양이가 느끼하다는 것을 알아차렸다. 그는 파일을 16진 형식으로 열었는데 나의 BOM 머리는 EF BB 3F, 내가 쓴 BOM은 EF BB BF 이었다.왜 이런 차이가 나는지, 내 BF가 어떻게 3F가 되었지?
UTF-8은 EF BB BF만 표시할 수 있기 때문에 알파벳 하나 차이로는 안 된다.
맏형은 osw.write(new String(new byte[] { (byte) 0xEF, (byte) 0xBB, (byte) 0xBF }));에 대해 String이 기본적으로 UTF-16의 인코딩을 하고 있으며, 우리가 쓸 때 어떤 형식도 가지고 있지 않아야 해석기가 읽을 수 있다고 의심했다. 만약에 String이 이렇게 바뀌면 다른 형식으로 바뀔 수 있다. 이것은 말하기 어렵다.
역시 맏형, 한마디로!
그래서 나는 String을 없애고byte 그룹의 BOM에 직접 쓰려고 했다.수정된 코드는 다음과 같습니다.
            FileOutputStream fos = new FileOutputStream(file);
            fos.write(new byte[] { (byte) 0xEF, (byte) 0xBB, (byte) 0xBF });
            OutputStreamWriter osw = new OutputStreamWriter(fos);
            osw.append(s);
            osw.flush();

원래osw.write()osw.append()로 바뀌었다.이것 괜찮아요?

최종 운행 결과는 기쁘다. 성공적으로 열 수 있다.


사실 우리 두 컴퓨터 사이의 차이는 하나는 윈도우즈이고, 하나는 맥이다.나는 맥이 BOM을 호환했다고 의심한다. 검사는 윈도우즈가 엄격하지 않다.뒤에 내가 조사해 보니 사실 UTF-8 자체에 BOM이 없고 그것에 BOM을 더하는 것은 순전히 마이크로소프트의 습관이다.

이렇게 많이 말했는데, 너 좀 헷갈리지 않니?사실 나도 헷갈려서 계속 지식을 보충해야겠어, 바이~


메시지를 남기신 것을 환영합니다.
나는 털이야, 만나서 고마워.

좋은 웹페이지 즐겨찾기