programing

sep=";" 문이 XSL에서 생성된 CSV 파일에서 utf8 BOM을 차단합니다.

oldcodes 2023. 4. 14. 22:06
반응형

sep=";" 문이 XSL에서 생성된 CSV 파일에서 utf8 BOM을 차단합니다.

현재 XSLT를 사용하여 CSV export를 개발하고 있습니다.그리고 CSV 파일은 엑셀에서 %99% 사용되기 때문에 엑셀 동작을 고려해야 합니다.

첫 번째 문제는 csv의 독일어 특수문자였습니다.CSV 인코딩이 UTF8인 경우에도 Excel은 UTF8로 CSV 파일을 올바르게 열 수 없습니다.그 특수 캐릭터들은 이상한 상징들을 얻고 있다.나는 이 문제에 대한 해결책을 찾았다.컨텐츠 바이트의 선두에 3바이트(EF BB BF - a.k.a BOM Header)를 추가했습니다.UTF8 BOM은 엑셀에게 '야, UTF8이야 제대로 열어봐'라고 말하는 방식이기 때문이다.문제 해결!

그리고 두 번째 문제는 분리기에 관한 것이었습니다.지역에 따라 기본 구분 기호는 쉼표 또는 세미콜론일 수 있습니다.독일에서는 세미콜론, 영국에서는 콤마인 것 같아요.따라서 이 문제를 방지하기 위해 아래에 행을 추가해야 합니다.

<xsl:text>sep=;</xsl:text>

또는

<xsl:text>sep=,</xsl:text>

(이 세퍼레이터는 하드코드로 구현되지 않았습니다)

그러나 UT8-BOM에서 CSV 파일을 생성하는 동안 파일 시작 부분에 "syslog=;" 또는 "syslog="를 추가하면 BOM이 특수 문자를 제대로 표시하는 데 도움이 되지 않는다는 점이 문제입니다.BOM 바이트는 항상 바이트 배열의 선두에 있습니다.이 스크린샷은 Mac OS X의 MS Excel에서 찍은 것입니다.

여기에 이미지 설명 입력

처음 3개의 기호는 BOM 헤더에 속합니다.

당신은 이런 문제를 겪어본 적이 있나요? 아니면 제안할 것이 있나요?감사해요.

편집:

나는 인쇄 화면을 공유한다.

a. BOM과 <xsl:text>sep=;</xsl:text>

여기에 이미지 설명 입력

b. BOM만으로

여기에 이미지 설명 입력

자바 코드:

// Write the bytes
ServletOutputStream out = resp.getOutputStream();
if(contentType.toString().equals("CSV")) {
  // The additional bytes in below is prefix indicates that the content is in UTF-8.
  out.write(239);
  out.write(187);
  out.write(191);
} 
out.write(bytes); // Content bytes, in this case XSL

XSL 코드:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:output method="text" version="1.0" encoding="UTF-8" indent="yes" />

    <xsl:template match="/">
    <xsl:text>sep=;</xsl:text>
    <table>
        ...
        </table>
</xsl:template>

맞습니다. Excel 2007에서는 CSV 파일을 더블클릭했을 때 인코딩과 분리기를 다른 로케일에 걸쳐 올바르게 로드할 수 있는 방법은 없습니다.

BOM 뒤에 sep=를 지정하면 BOM이 UTF-8임을 알려준 것을 잊어버리는 것 같습니다.

특정 로케일에서는 Excel이 분리자를 검출하지 않기 때문에 BOM을 지정해야 합니다.예를 들어 덴마크어에서는 기본 구분자는 ; 입니다.탭 또는 쉼표로 구분된 텍스트를 출력하면 구분자가 검출되지 않으며, 다른 로케일에서 세미콜론으로 구분하면 로드되지 않습니다.윈도우 설정에서 locae 형식을 변경하여 테스트할 수 있습니다. excel은 이것을 픽업합니다.

이 질문부터:Excel이 UTF-8 CSV 파일을 자동으로 인식하도록 할 수 있습니까?

유일한 방법은 BOM에서 UTF16le 인코딩을 사용하는 것입니다.

또, http://wiki.scn.sap.com/wiki/display/ABAP/CSV+tests+of+encoding+and+column+separator?original_fqdn=wiki.sdn.sap.com 에 의하면, 탭 구분 기호와 함께 utf16-le 를 사용하면, 동작하는 것 같습니다.

Excel이 sep=를 읽는지 궁금하고, CSV 텍스트를 취득하기 위한 방법을 재작성하여 BOM을 잃어버렸습니다.잘못된 텍스트를 입력하려고 했는데, sep과 인코딩을 모두 사용할 수 있는 작업을 찾을 수 없었습니다.

Excel 2013으로 테스트한 결과입니다.

UTF-8을 사용할 수 없는 경우 BOM + 데이터 +로 구성된 해결 방법이 있습니다.sep=;

입력(UTF8 인코딩으로 작성)

\ufeffSome;Header;Columns
Wîth;Fàncÿ;Stûff
sep=;

산출량

|Some|Header|Columns|
|Wîth|Fàncÿ |Stûff  |
|sep=|      |       |

솔루션의 문제는 Excel이 통역하는 동안sep=;올바르게 표시됩니다.sep=(그렇습니다.;마지막 행의 첫 번째 열에 )를 입력합니다.

다만, UTF16-LE 로서 쓸 수 있는 경우는, 실제의 솔루션이 있습니다.를 사용합니다.\t지정하지 않은 딜리미터sep엑셀이 공놀이를 할 거예요.

입력(UTF16-LE 인코딩으로 작성)

\ufeffSome;Header;Columns
Wîth;Fàncÿ;Stûff

산출량

|Some|Header|Columns|
|Wîth|Fàncÿ |Stûff  |

코멘트는 아직 쓸 수 없지만 @Pier-Luc Gendreau의 솔루션에 대해 언급하고 싶습니다.European Excel로 여는 것도 가능하지만 (디폴트로는 사용);delimiter) 및 완전한 utf-16을 지정합니다.LE 서포트에서는, 이 기술을 사용하는 것은 불가능하다고 생각됩니다.sep=,.

해결책의 문제는 Excel이 sep=;를 올바르게 해석하는 동안 마지막 줄의 첫 번째 열에 sep=(예, sep=;를 삼켜버립니다)라고 표시되는 것입니다.

디폴트 딜리미터가 아닌 딜리미터를 지정해도 동작하지 않습니다.(;내 경우)는 Excel이 마지막 행을 올바르게 해석하지 못하고 마지막 딜리미터를 삼켰다고 생각합니다.이것은 기본 동작이기 때문입니다.

틀렸으면 정정해 주세요

언급URL : https://stackoverflow.com/questions/20395699/sep-statement-breaks-utf8-bom-in-csv-file-which-is-generated-by-xsl

반응형