Microsoft Excel에서 .csv 파일의 분음 부호를 표시합니까?


190

프로그래밍 방식으로 데이터를 PHP 5.2를 사용하여 .csv 테스트 파일로 내보내고 있습니다.
데이터 예 : Numéro 1(강조 e를 참고하십시오). 데이터는 utf-8(선두 BOM이 없음)입니다.

이 파일을 MS Excel에서 열면이 표시됩니다 Numéro 1.

텍스트 편집기 (UltraEdit)에서 올바르게 열 수 있습니다. UE는 캐릭터가보고합니다 decimal 233.

가져 오기 마법사 또는 기본이 아닌 마법사 설정을 사용하지 않고 MS Excel 에서 텍스트 데이터를 올바르게 렌더링 하도록 텍스트 데이터를 .csv 파일로 내보내 려면 어떻게 해야합니까?


나는 나에게 효과가없는 "EF BB BF"를 시도했다고 생각하기 때문에 BOM 솔루션에 대해 더 많은 것을 듣고 싶다.
James Baker

3
선택한 작업 솔루션은 다음과 같습니다. * BOM 포함; utf-8 *이 헤더를 사용하십시오 : 'Content-type : text / plain; charset = utf-8 '이것은 엑셀 2003과 엑셀 2007에서 "작동했습니다"– 가져 오기 마법사없이 열렸고 분음 부호를 올바르게 렌더링했습니다. BOM이 필요한지 확인하지 못했습니다.
Freddo411

2
BOM이 필요합니다. 방금 이것을 테스트했습니다. 그것 없이는 특수 문자가 제대로 렌더링되지 않습니다.
Alex Ciminian

2
누군가 BOM (바이트 순서 표시기)을 추가하는 방법에 대해 더 많이 말할 수 있다면 그것을 좋아할 것입니다. Response.Write (EF BB BF ")와 같은 작업을 수행하면 파일의 시작 부분에 해당 문자가 표시됩니다.
sydneyos

sydneyos : Fergal이 아래와 같이 말합니다; 문자열 앞에 \ uFEFF를 붙입니다.
noocyte

답변:


243

올바른 형식의 UTF8 파일은 바이트 순서 표시 를 처음 세 옥텟으로 가질 수 있습니다 . 16 진수 값 0xEF, 0xBB, 0xBF입니다. 이 8 진수는 파일을 UTF8로 표시하는 역할을합니다 ( "바이트 순서"정보와 관련이 없기 때문에). 1 이 BOM이 존재하지 않으면 소비자 / 리더는 텍스트의 인코딩 유형을 유추해야합니다. UTF8을 지원하지 않는 리더는 바이트를 Windows-1252와 같은 다른 인코딩으로 읽고 파일 시작 부분에 문자 를 표시 합니다.

파일 연결을 통해 UTF8 CSV 파일을 열 때 Excel 에서 UTF8 BOM의 존재를 무시 하고 1 바이트 인코딩으로 가정하는 것으로 알려진 버그가 있습니다. 시스템 기본 코드 페이지 또는 언어 설정으로 이를 수정할 수 없습니다 . BOM은 Excel에서 단서가 아니며 작동하지 않습니다. 소수 보고서는 BOM이 때때로 "텍스트 가져 오기"마법사를 트리거한다고 주장합니다.이 버그는 Excel 2003 및 이전 버전에 존재하는 것으로 보입니다. 대부분의 보고서 (여기서 답변 중 가장 작은)는 이것이 Excel 2007 이상에서 수정되었다고 말합니다.

참고 당신 항상 *이 파일 당신에게있는 거 개방의 인코딩을 지정할 수 있습니다 "텍스트 가져 오기"마법사를 사용하여 Excel에서 제대로 열리지 UTF8의 CSV 파일. 물론 이것은 훨씬 덜 편리합니다.

이 답변을 읽는 독자는 특히 Excel <2007을 지원하지 않지만 원시 UTF8 텍스트를 Excel로 전송하여 텍스트를 잘못 해석하고 텍스트를 Ã유사한 Windows-1252 문자로 뿌려주 는 상황에있을 가능성이 큽니다 . UTF8 BOM을 추가하는 것이 아마도 가장 빠르고 가장 좋은 해결책 일 것입니다.

이전 Excel 사용자와 관련이 있고 Excel이 CSV의 유일한 소비자 인 경우 UTF8 대신 UTF16을 내보내이 문제를 해결할 수 있습니다. Excel 2000 및 2003은이를 두 번 클릭하여 올바르게 엽니 다. (일부 다른 텍스트 편집기는 UTF16에 문제가있을 수 있으므로 옵션을 신중하게 평가해야 할 수도 있습니다.)


* 할 수없는 경우를 제외하고 (적어도) Mac 가져 오기 마법 사용 Excel 2011은 사용자가 말한 내용에 관계없이 실제로 모든 인코딩에서 작동하지는 않습니다. </ anecdotal-evidence> :)


14
인코딩을 지정할 위치를 영원히 찾았습니다. 저장 대화 상자> 도구 버튼> 웹 옵션> 인코딩 탭. 그들은 그런 중요한 것들을 숨기는 데 능숙합니다.
Triynko

6
잘못됨 : UTF-8 파일에 BOM을 추가하면 Excel 2007에서 가져 오기 마법사 없이도 해당 파일이 올바르게로드됩니다.
Victor Nicollet

3
우리는 오늘 Victor가 말한 것과 동일한 것을 발견했습니다 (Excel 2010을 사용하면 모든 것이 가능합니다). UTF-8 BOM / 서명 (EF BB BF)을 추가하면 시스템 기본 인코딩을 사용하여 더블 클릭을 수정하는 것으로 보이며 UTF8을 올바르게 사용합니다.)
Danny Tuppeny

20
일반적으로 하는 UTF-8 인코딩 된 파일은해야 하지 바이트 순서 표시가 앞에 추가합니다. UTF-8은 가변 바이트 순서가 없으므로 UTF-8의 ASCII 호환성을 방해합니다. UTF-8 faux-BOM을 허용하거나 권장하는 특정 파일 형식이 있지만 피해야합니다. CSV는 전적으로 인코딩에 무지하므로 주어진 툴이 바이트 시퀀스 0xEF 0xBB 0xBF를 UTF-8의 지표로 해석할지 여부는 누구나 추측 할 수 있습니다. 제 1 셀에서 보이지 않는 제어 문자; 첫 번째 셀 의 문자 ; 또는 완전히 다른 것.
bobince

3
@Ian : 아무도 BOM 있는 UTF-8인지 확실하지 않습니다-0xEF 0xBB 0xBF는 대부분의 기존 인코딩에서도 유효한 순서입니다 (따라서 종종 ISO-8859-1 또는 cp1252로 잘못 해석되어으로 표시됨 ). 알고리즘 추측 및 특별히 허용되는 파일 형식 (예 : XML)에만 도움이됩니다. UTF-8 파일에 faux-BOM을 포함하는 단점은 ASCII 호환성 (UTF-8의 주요 판매 지점)을 깨뜨리는 것입니다. 많은 인코딩이 무시되는 텍스트 도구가 예기치 않은 주요 faux-BOM에 직면하게됩니다.
bobince

39

Excel에서 파일을 UTF-8로 인식했기 때문에 BOM 앞에 추가 (\ uFEFF) (Excel 2007)되었습니다. 그렇지 않으면 저장하고 가져 오기 마법사를 사용하는 것이 좋지만 덜 이상적입니다.


1
여전히 텍스트 가져 오기 마법사가 열리므로 차이점은 단순히 두 번 클릭 할 수 있으므로 이상적이지는 않지만 유일하게 알려진 솔루션입니다.
haridsv

저에게는 Excel 2007에 가져 오기 마법사가 나타나지 않습니다.
Victor Nicollet

가져 오기 마법사도 없습니다. UTF8 BOM / 서명 (EF BB BF)이있는 경우 예상대로 작동합니다.
Danny Tuppeny

또한 UTF-8 BOM \ufeff이 아닌 UTF-16 (BE) BOM입니다.
Alastair McCormack

2
아니요, @AlastairMcCormack은 인코딩 방식에 따라 다릅니다. UTF-8로 인코딩 된 "\ ufeff"는 정확히 EF BB BF입니다. (UTF-16으로 인코딩되면 2 바이트입니다.)
Dave Burt

30

다음은 Microsoft Excel을 사용자에게 보낼 때 프로젝트에서 사용하는 PHP 코드입니다.

  /**
   * Export an array as downladable Excel CSV
   * @param array   $header
   * @param array   $data
   * @param string  $filename
   */
  function toCSV($header, $data, $filename) {
    $sep  = "\t";
    $eol  = "\n";
    $csv  =  count($header) ? '"'. implode('"'.$sep.'"', $header).'"'.$eol : '';
    foreach($data as $line) {
      $csv .= '"'. implode('"'.$sep.'"', $line).'"'.$eol;
    }
    $encoded_csv = mb_convert_encoding($csv, 'UTF-16LE', 'UTF-8');
    header('Content-Description: File Transfer');
    header('Content-Type: application/vnd.ms-excel');
    header('Content-Disposition: attachment; filename="'.$filename.'.csv"');
    header('Content-Transfer-Encoding: binary');
    header('Expires: 0');
    header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
    header('Pragma: public');
    header('Content-Length: '. strlen($encoded_csv));
    echo chr(255) . chr(254) . $encoded_csv;
    exit;
  }

업데이트 : 파일 이름 개선 및 BUG 수정 올바른 길이 계산. TRiG@ ivanhoe011 에게 감사합니다


1
이 페이지에서 몇 가지 다른 제안을 시도했지만 Excel 2007에서 효과가있었습니다. 가장 중요한 변경 사항은 쉼표 대신 탭 (.csv 파일 임에도 불구하고)을 사용하고 위의 줄은 두 문자를 에코하는 것입니다. mb_convert_encoding ()을 호출하십시오. 또한 mb_convert_encoding ()을 지원하기 위해 --enable-mbstring을 사용하여 PHP를 다시 컴파일해야했습니다. 감사!
Russell G

1
이것은 나에게도 효과적이었습니다. 감사합니다. 그러나, 사파리 나는 내 콘솔 '자원이 문서로 해석하지만,로 ... 이전'는 판단, 웹킷의 특질이다 같아요에 오류가 stackoverflow.com/questions/3899426/...을 , 그러나 아마 그것은 아니에요 및 / 또는 사람이있다 해결책을 찾았습니다. 또한 귀하의 예에서 'Content-Disposition: attachment; filename="'.$filename.'.csv"'Firefox는 큰 따옴표를 원하기 때문에 변경을 제안합니다. 그렇지 않으면 공백 후에 파일 이름이 잘립니다.
kasimir

CSV ( text/csv) 를 출력 하지만 Excel ( application/vnd.ms-excel) 이라고 부르는 이유는 무엇 입니까?
TRiG

2
이것은 잘 작동합니다! Mac에서도 작동하는지 확인할 수 있습니다 (Office 2011).
Jonathan

이러면 안 header('Content-Length: '. mb_strlen($encoded_csv, 'UTF-16LE'));됩니까?
Rich Bradshaw

13

Excel 버전 (2003 + 2007)과 파일 형식의 모든 조합에 대한 답변

여기에있는 대부분의 다른 답변은 Excel 버전에만 해당되며 반드시 Excel 버전에만 해당되는 답변이 아니기 때문에 반드시 도움이되는 것은 아닙니다.

예를 들어 BOM 문자를 추가하면 자동 열 구분 기호 인식에는 문제가 있지만 모든 Excel 버전에는 해당되지 않습니다.

대부분의 Excel 버전에서 작동하는지 확인하는 3 가지 변수가 있습니다.

  • 부호화
  • BOM 캐릭터 존재
  • 세포 분리기

SAP를 훔친 사람이 모든 조합을 시도하고 결과를보고했습니다. 최종 결과? BOM 및 탭 문자와 함께 UTF16le을 구분 기호로 사용하여 대부분의 Excel 버전에서 작동합니다.

당신은 나를 믿지 않습니까? 나도 아니고 여기를 읽고 울다 : http://wiki.sdn.sap.com/wiki/display/ABAP/CSV+tests+of+encoding+and+column+separator


왜 추가 sep=,하거나 사용하고 싶은 것이 아닌가? 이미 BOM을 추가하고 있다면 파일에 물건을 추가하는 것을 반대한다고 가정합니다.
Casey

글쎄, 실제로, 내 자신의 질문에 대답하기 위해 필드 구분 기호 선언을 추가하지 않을 것입니다.이 트릭이 작동을 멈추게하기 때문입니다. 따라서 사용자가 잘못된 지역 설정을 사용하는 경우 기본적으로 인코딩이 잘못되었거나 파일이 CSV로 올바르게 해석되지 않습니다.
Casey

1
utf-16le + BOM (0xFF 0xFE) + 탭이 최고입니다
zhaozhi

10

가져올 때 UTF-8 인코딩을 선택하십시오. Office 2007을 사용하는 경우 파일을 연 직후에 선택한 위치입니다.


1
유용합니다. 마법사를 사용하지 않고이 작업을 수행하는 방법을 묻도록 질문을 수정했습니다
Freddo411

9

CSV 데이터를 출력하기 전에 에코 UTF-8 BOM. 이것은 Windows의 모든 문자 문제를 해결하지만 Mac에서는 작동하지 않습니다.

echo "\xEF\xBB\xBF";

Windows PC에서만 사용되는 파일을 생성해야하기 때문에 저에게 효과적입니다.


모든 유형의 열 구분 기호 나 모든 Excel 버전에 해당되는 것은 아닙니다. 아래에서 내 대답을 읽으십시오 (아래).
Christiaan Westerbeek 2018 년

7

서비스 팩이 없거나 BOM이 있거나없는 (U + ffef 또는 0xEF, 0xBB, 0xBF, 둘 다 작동하지 않음) 서비스 팩 없이는 Office 2007에서 UTF-8이 작동하지 않습니다. sp3을 설치하면 0xEF, 0xBB, 0xBF BOM이 접두사.

UTF-16은 0xff 0xef BOM이 앞에 "utf-16-le"을 사용하고 탭을 구분 기호로 사용하여 Python으로 인코딩 할 때 작동합니다. 수동으로 BOM을 작성하고 "utf-16"대신 "utf-16-le"을 사용해야했습니다. 그렇지 않으면 각 encode ()가 작성된 모든 행에 BOM을 추가하여 첫 번째 열의 가비지로 표시했습니다 두 번째 줄과 그 이후.

SP로 설치하지 않고 UTF-16이 작동하는지 여부를 알 수 없습니다. 이전으로 돌아갈 수 없기 때문입니다. 한숨

이것은 MAC에 대한 사무실에 관한 것입니다.

두 작업 사례 모두 브라우저에서 직접 다운로드를 시작할 때 가져 오기가 작동하고 텍스트 가져 오기 마법사가 중단되지 않으며 예상대로 작동합니다.


Mac 용 Excel 2011에서도 작동합니다.
Adam

귀하의 게시물에 감사드립니다. utf-16le은 office 2007 sp3을 설치하지 않았어도 괜찮습니다. 그러나 BOM은 0xFF 0xFE입니다.
zhaozhi

4

Fregal이 말했듯이 \ uFEFF는 갈 길입니다.

<%@LANGUAGE="JAVASCRIPT" CODEPAGE="65001"%>
<%
Response.Clear();
Response.ContentType = "text/csv";
Response.Charset = "utf-8";
Response.AddHeader("Content-Disposition", "attachment; filename=excelTest.csv");
Response.Write("\uFEFF");
// csv text here
%>

1
BOM을 사용할 때 Excel 2007에서 탭 구분 기호가 어떻게 무시되는지 확인하십시오. 더 많은 것을 생각해 내야합니다.
Christiaan Westerbeek

3

또한 질문이 얼마 전에 "답변"되었다는 것을 알았지 만 텍스트 마법사를 사용하지 않고 Excel에서 utf8로 인코딩 된 CSV 파일을 열 수 없다는 이야기를 이해하지 못합니다.

재현 가능한 경험 : Old MacDonald had a farm,ÈÌÉÍØ메모장에 입력하고 Enter 키를 누른 다음 다른 이름으로 저장 (UTF-8 옵션 사용)을 누르십시오.

파이썬을 사용하여 실제로 무엇이 있는지 보여줍니다.

>>> open('oldmac.csv', 'rb').read()
'\xef\xbb\xbfOld MacDonald had a farm,\xc3\x88\xc3\x8c\xc3\x89\xc3\x8d\xc3\x98\r\n'
>>> ^Z

좋은. 메모장이 BOM을 앞에 놓았습니다.

이제 Windows 탐색기로 이동하여 파일 이름을 두 번 클릭하거나 마우스 오른쪽 버튼을 클릭하고 "Open with ..."를 사용하면 예상대로 Excel (2003)이 표시됩니다.


@Cocowalla : 글쎄, 나는 이것을 시도했다 (다시; 게시하기 전에 테스트 했음) 그리고 Excel 2007 (지금 사용중인 것)과 함께 작동했습니다. open('oldmac.csv', 'rb').read()입력 내용을 확인 했습니까 ?
John Machin

Excel 2007에서는 시도하지 않았습니다 (Excel 2007에서는 BOM을 사용하여 UTF-8 파일을 읽는다는 것을 알고 있습니다). Excel 2003에서는 시도했습니다
Cocowalla

@Cocowalla : Excel 2003을 사용할 때 제대로 작동했습니다. Excel 2003 용 최신 서비스 팩이 있습니까? 내가 제안한대로 입력을 확인 했습니까?
John Machin

메모장이 파일의 시작 부분에 BOM이 붙어 있는지 확인했지만 Excel 2003 SP2를 사용하고 있습니다 (SP3 사용 가능). 이것은 SP3에서만 작동
한다고

2

확장자가 'xls'인 html 파일을 저장할 수 있으며 악센트가 작동합니다 (2007 년 이전).

예 : 메모장에 utf8로 저장을 사용하여 test.xls로 저장하십시오.

<html>
<meta http-equiv="Content-Type" content="text/html" charset="utf-8" />
<table>
<tr>
  <th>id</th>
  <th>name</th>
</tr>
<tr>
 <td>4</td>
 <td>Hélène</td>
</tr>
</table>
</html>

흥미로운 옵션. 텍스트를 열지 만 어떤 이유로 든 모든 페이지가 완전히 흰색입니다. 고전 스프레드 시트없이 라인은 행과 열 (Mac 용 사무실) 구분
세바스찬 사스 트레

네, Windows의 Office 2007에서도 마찬가지입니다. 솔직히 말해서 전혀 효과가 없었습니다. 당신이 추가하면 (참고, border="1"테이블, 당신은 줄을 얻을 수 있지만, 단지 주변의 4 셀 :
Benjol

1

이것은 문자 인코딩 문제입니다. UTF-8로 데이터를 내보내는 것처럼 보입니다. UTF-8에서 é는 2 바이트 시퀀스 0xC3 0xA9이며 Windows-1252에서 해석 될 때 Ã ©입니다. 데이터를 Excel로 가져올 때 사용중인 문자 인코딩이 UTF-8임을 알려주십시오.


데이터가 UTF-8임을 확인했습니다. (? BOM) 내 데이터가 UTF-8입니다 엑셀 알려 파일에 넣어 무엇을
Freddo411

파일 인코딩을 변경해야한다고 생각합니다. Excel은 시스템 기본 코드 페이지를 사용하여 csv 파일을 처리합니다.
Albertein

현재 사용중인 컴퓨터에 Excel이 설치되어 있지 않기 때문에 OpenOffice를 사용하면 CSV 파일을 가져올 때 문자 인코딩을위한 드롭 다운 상자가 있습니다. 거기서 유니 코드 (UTF-8)를 선택하십시오.
Adam Rosenfield 2016 년

엑셀 AFAIK 드롭 다운이없는
albertein

1

CSV 형식은 Excel에서 유니 코드가 아닌 ASCII로 구현되므로 분음 부호를 조작 할 수 있습니다. 우리는 공식 CSV 표준이 Excel에서 ASCII 기반으로 정의되었다는 것을 추적하는 방법과 동일한 문제를 겪었습니다.


실제로 CSV는 특정 인코딩에 바인딩되지 않습니다. ASCII를 가정하는 것은 Excel입니다. en.wikipedia.org/wiki/
쉼표로 구분 된 _ 값

그게 내가 말한거야. "Excel에서 ASCII로 구현 됨", "CSV는 Excel에서 ASCII 기반으로 정의 됨". 당신이 나와 동의하는 것처럼 보이게 만드는 시점이 확실하지 않습니다.
Jeff Yates

2
실제로 "CSV 형식은 ASCI로 구현되어 있습니다"라고 말하면 혼동이 시작되는 지점이라고 생각합니다.
RichardOD

1

Excel 2007은 BOM (EF BB BF) 인코딩 CSV로 UTF-8을 올바르게 읽습니다.

Excel 2003 (및 이전 버전)은 BOM (FF FE)과 함께 UTF-16LE을 읽지 만 쉼표 나 세미콜론 대신 TAB을 사용합니다.


1

올바른 바이트 순서 표시로 시작하여 탭으로 구분 된 리틀 엔디안 UTF-16으로 Excel 2007에서 CSV를 올바르게 구문 분석 할 수 있습니다.


1

출력 CSV 파일에 BOM을 작성하면 실제로 장고에서 효과가있었습니다.

def handlePersoonListExport(request):
    # Retrieve a query_set
    ...

    template = loader.get_template("export.csv")
    context = Context({
        'data': query_set,
    })

    response = HttpResponse()
    response['Content-Disposition'] = 'attachment; filename=export.csv'
    response['Content-Type'] = 'text/csv; charset=utf-8'
    response.write("\xEF\xBB\xBF")
    response.write(template.render(context))

    return response

자세한 내용은 http://crashcoursing.blogspot.com/2011/05/exporting-csv-with-special-characters.html 감사합니다!


예, 이것은 Excel 2010에서 저에게 효과적이었습니다. Java 사용의 printWriter.print('\ufeff')경우 java에서 UTF-8 BOM을 추가하는 방법 도 참조하십시오 .
tsauerwein

1

내가 찾은 또 다른 솔루션은 결과를 Windows 코드 페이지 1252 (Windows-1252 또는 CP1252)로 인코딩하는 것입니다. 이것은 예를 들어, Content-Type비슷한 것으로 적절히 text/csv; charset=Windows-1252설정하고 응답 스트림의 문자 인코딩을 유사하게 설정 함으로써 수행 될 수있다 .


이것에 감사합니다. 엑셀 윈도우와 맥에서 작동합니다. 나는 그것을 사용하고 있습니다.
Sebastian Sastre

이것은 ASCII 이외의 문자 범위가 Windows-1252 내에있는 경우에만 작동합니다. 예를 들어, 한국어 / 중국어 / 일본어, 키릴 어 등은 없습니다. 그러나 대부분의 서유럽 언어에 대해서는 이것으로 넘어갈 것입니다.
Tom McClure

1

UTF-8 BOM을 포함하는 것이 반드시 좋은 생각은 아닙니다. Mac 버전의 Excel에서는이를 무시하고 BOM을 ASCII로 표시합니다. 스프레드 시트의 첫 번째 필드 시작 부분에 3 개의 불쾌한 문자…


이 의견은 6 년 후인 것을 알고 있지만 FWIW : JavaScript를 사용하여 '\uFEFF' + myCsvStringMac Excel 15.19.1 (2016)에서 예상대로 작동 하는 파일을 다운로드합니다 .
bobjones

0

파일을 생성하는 인코딩을 확인하고 파일을 올바르게 표시하려면 시스템 기본 코드 페이지를 사용해야합니다.

사용중인 언어? .Net 인 경우 파일을 생성하는 동안 Encoding.Default 만 사용하면됩니다.


내보내기 데이터는 utf-8입니다. 나는 PHP 5로 내보내기 파일을 쓰고 있어요
Freddo411

데이터를 Windows-1252 코드 페이지로 코드 변환하십시오. PHP로 데이터를
완성

0

내가 가지고있는 것처럼 vb.net에 레거시 코드가 있다면 다음 코드가 효과적입니다.

    Response.Clear()
    Response.ClearHeaders()
    Response.ContentType = "text/csv"
    Response.Expires = 0
    Response.AddHeader("Content-Disposition", "attachment; filename=export.csv;")
    Using sw As StreamWriter = New StreamWriter(Context.Response.OutputStream, System.Text.Encoding.Unicode)
        sw.Write(csv)
        sw.Close()
    End Using
    Response.End()

0

문제를 해결할 수있는 방법을 찾았습니다. 이것은 나쁜 해킹이지만 작동합니다. Open Office로 문서를 연 다음 Excel 형식으로 저장하십시오. 결과 .xls또는 .xlsx강조 문자를 표시합니다.


1
OP는 프로그래밍 방식으로 내보내기 중이므로 수동 개입이 필요한 솔루션을 찾고 있지 않다고 말합니다.
Christiaan Westerbeek

0

Ruby 1.8.7에서는 모든 필드를 UTF-16으로 인코딩하고 BOM을 버립니다.

다음 코드는 active_scaffold_export에서 추출됩니다.

<%                                                                                                                                                                                                                                                                                                                           
      require 'fastercsv'                                                                                                                                                                                                                                                                                                        
      fcsv_options = {                                                                                                                                                                                                                                                                                                           
        :row_sep => "\n",                                                                                                                                                                                                                                                                                                        
        :col_sep => params[:delimiter],                                                                                                                                                                                                                                                                                          
        :force_quotes => @export_config.force_quotes,                                                                                                                                                                                                                                                                            
        :headers => @export_columns.collect { |column| format_export_column_header_name(column) }                                                                                                                                                                                                                                
      }                                                                                                                                                                                                                                                                                                                          

      data = FasterCSV.generate(fcsv_options) do |csv|                                                                                                                                                                                                                                                                           
        csv << fcsv_options[:headers] unless params[:skip_header] == 'true'                                                                                                                                                                                                                                                      
        @records.each do |record|                                                                                                                                                                                                                                                                                                
          csv << @export_columns.collect { |column|                                                                                                                                                                                                                                                                              
            # Convert to UTF-16 discarding the BOM, required for Excel (> 2003 ?)                                                                                                                                                                                                                                     
            Iconv.conv('UTF-16', 'UTF-8', get_export_column_value(record, column))[2..-1]                                                                                                                                                                                                                                        
          }                                                                                                                                                                                                                                                                                                                      
        end                                                                                                                                                                                                                                                                                                                      
      end                                                                                                                                                                                                                                                                                                                        
    -%><%= data -%>

중요한 라인은 :

Iconv.conv('UTF-16', 'UTF-8', get_export_column_value(record, column))[2..-1]

-2

Encode에서 notepad ++ clic로 csv 파일을 열고 UTF-8로 변환 (UTF-8로 변환하지 않음 (BOM없이))을 선택하십시오.


1
프로그래밍 방식으로 수행되어야하고 모든 파일을 수동으로 다시 저장하기 위해 사용자의 개입이 필요하지 않으므로 질문에 대답하지 않습니다.
Joe W
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.