CSV 파일을 Excel로 여는 퀴즈 문제
코드를 바꾸어 저장한 후 다시 열면 됩니다.디코딩 작업은 다음과 같습니다. 편집기 -> 다른 이름으로 저장 -> 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을 더하는 것은 순전히 마이크로소프트의 습관이다.
이렇게 많이 말했는데, 너 좀 헷갈리지 않니?사실 나도 헷갈려서 계속 지식을 보충해야겠어, 바이~
메시지를 남기신 것을 환영합니다.
나는 털이야, 만나서 고마워.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.