source

Microsoft Excel이 .csv 파일에 Diacritics를 망칠까요?

manysource 2023. 4. 10. 22:02

Microsoft Excel이 .csv 파일에 Diacritics를 망칠까요?

(PHP 5.2를 사용하여) 데이터를 .csv 테스트 파일로 프로그래밍 방식으로 내보내고 있습니다.
예: " " "Numéro 1( 트에에에에에에에에 。는 ★★★★★★★★★★★★★★★★.utf-8는 BOM은 없습니다 (「BOM」)

에서 이 Excel로 됩니다.Numéro 1.

UltraEdit(UltraEdit)에 관한 정보입니다.는 이 라고 보고합니다.decimal 233.

텍스트 데이터를 .csv 파일로 내보내면 MS Excel에서 올바르게 렌더링할있습니다(가능한 한 Import 마법사 또는 기본값 이외의 마법사 설정을 사용하지 않고).

올바른 형식의 UTF8 파일에는 처음 3개의 옥텟으로 바이트 순서 마크를 붙일 수 있습니다.이것들은 16진수치 0xEF, 0xBB, 0xBF 입니다.이러한 옥텟은 파일을 UTF8로 마크하는 역할을 합니다('바이트 순서' 정보와는 관련이 없기 때문에).1 이 BOM이 존재하지 않는 경우, 사용자/판독자는 텍스트의 부호화 유형을 추론할 수 있습니다.UTF8을 지원하지 않는 리더는 Windows-1252 등의 다른 인코딩으로 바이트를 읽고 문자를 표시합니다.파일의 선두에 표시됩니다.

파일 어소시에이션을 통해 UTF8 CSV 파일을 열었을 때 Excel이 UTF8 BOM의 존재를 무시하고 단일 바이트 인코딩으로 간주하는 이미 알려진 오류가 있습니다.이것은, 시스템의 디폴트 코드 페이지 또는 언어 설정에서는 수정할 수 없습니다.BOM은 Excel에서 힌트를 얻을 수 없습니다.그냥 작동하지 않습니다.(소수 보고서에 따르면 BOM이 "텍스트 가져오기" 마법사를 트리거하는 경우가 있다고 합니다.)이 버그는 Excel 2003 이전 버전에 존재하는 것으로 보입니다.대부분의 보고서(여기서 답변 참조)에서는 Excel 2007 이후로는 수정되었다고 합니다.

여는 파일의 인코딩을 지정할 수 있는 「텍스트 Import」마법사를 사용하면, 항상 Excel 로 UTF8 CSV 파일을 올바르게 열 수 있습니다*.물론 이것은 훨씬 덜 편리하다.

의 독자는 Excel < >를 특별히 로 UTF8 하고 있을 이가 잘못 되어 Excel < 2007 >로 있습니다.이것이 잘못 해석되어 텍스트를 분산시키고 있습니다.Ã기타 유사한 Windows-1252 문자.UTF8 BOM을 추가하는 것이 가장 빠르고 최선의 해결책일 것입니다.

오래된 Excel 사용자 중 Excel 사용자만 CSV를 사용하는 경우 UTF8 대신 UTF16을 내보냄으로써 이 문제를 해결할 수 있습니다.Excel 2000 및 2003에서는 올바르게 더블클릭됩니다.(다른 텍스트 에디터에서는 UTF16에 문제가 있을 수 있으므로 옵션을 신중하게 검토해야 합니다.)


* 할 수 없는 경우를 제외하고, Mac의 Import Wizard용 Excel 2011이 실제로 모든 인코딩에서 작동하는 것은 아닙니다.</total-total> :)

BOM (\uFEFF)을 추가하는 것은 Excel 2007)에 도움이 되었습니다.Excel이 파일을 UTF-8로 인식했기 때문입니다.그렇지 않으면 파일을 저장하고 Import 마법사를 사용하는 것은 가능하지만 이상적인 방법은 아닙니다.

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 덕분에

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

그 외의 대부분의 답변은 Excel 버전에만 관련된 것으로, 반드시 도움이 되는 것은 아닙니다.Excel 버전에는 해당 답변이 들어맞지 않을 수 있기 때문입니다.

예를 들어 BOM 문자를 추가하면 모든 Excel 버전이 아닌 자동 열 구분자 인식 문제가 발생합니다.

대부분의 Excel 버전에서 동작하는지 여부를 결정하는 변수는 다음 3가지입니다.

  • 부호화
  • BOM 문자 존재
  • 셀 분리기

SAP의 금욕적인 누군가가 모든 조합을 시도했고 결과를 보고했습니다.최종 결과?대부분의 Excel 버전에서 작동하려면 BOM과 탭 문자를 구분자로 사용하여 UTF16le을 사용합니다.

날 못믿는 거에요?나 역시 그렇지 않지만, 여기를 읽고 눈물을 흘리세요: http://wiki.sdn.sap.com/wiki/display/ABAP/CSV+tests+of+encoding+and+column+separator

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

echo "\xEF\xBB\xBF";

Windows PC에서만 사용할 파일을 생성해야 하기 때문에 문제 없습니다.

[ UTF - 8 enconding ]를 선택합니다.Office 2007 을 사용하고 있는 경우는, 파일을 연 직후에, 이 장소를 선택합니다.

sp3를 설치하면 0xEF, 0xBB, 0xBF BOM이 추가되어도 UTF-8은 서비스 팩이 없거나 BOM(U+fef 또는 0xEF, 0xBBB, 0xBF, 어느 쪽도 작동하지 않음)이 없는 Office 2007에서는 작동하지 않습니다.

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

UTF-16이 SP를 설치하지 않으면 동작하는지 알 수 없습니다.지금 돌아갈 수 없기 때문입니다.

이것은 윈도우에 있습니다.MAC용 오피스에 대해서는 모릅니다.

두 작업 케이스 모두 브라우저에서 직접 다운로드를 시작할 때 Import가 작동하고 텍스트 Import 마법사가 개입하지 않을 경우 예상대로 작동합니다.

Fregal이 말했듯이, \uFEF가 최선의 방법이다.

<%@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
%>

또, 이 질문에 「답변」한 지 얼마 되지 않았지만, 텍스트 마법사를 사용하지 않고서는 utf8로 인코딩된 csv 파일을 Excel로 정상적으로 열 수 없다는 이야기는 이해할 수 없습니다.

재현 가능한 경험:유형Old MacDonald had a farm,ÈÌÉÍØ[ Enter ] 、 [ Save As ]를 누릅니다(UTF-8 옵션 사용).

Python을 사용하여 실제 내용물을 보여줍니다.

>>> 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)이 표시됩니다.

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

예: 테스트로 저장합니다(메모장에 있는 Save As utf8 사용).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>

이것은 단지 문자 인코딩에 대한 질문이다.UTF-8로 데이터를 내보내는 것처럼 보입니다. UTF-8의 e는 2바이트 시퀀스 0xC3 0xA9이며, Windows-1252에서 해석하면 interpre©입니다.데이터를 Excel로 Import할 때는 반드시 사용 중인 문자 인코딩이 UTF-8임을 알려주시기 바랍니다.

CSV 형식은 Excel에서 Unicode가 아닌 ASCII로 구현되므로 분음 부호가 엉망이 됩니다.같은 문제가 발생했습니다.그 때문에, Excel에서는 공식 CSV 규격이 ASCII 베이스로 정의되어 있는 것을 추적했습니다.

Excel 2007 에서는, BOM(EF BB BF)로 부호화된 CSV 를 사용해 UTF-8 를 올바르게 읽어낼 수 있습니다.

Excel 2003(및 그 이전 버전)에서는 콤마나 세미콜론이 아닌 TAB를 사용하여 UTF-16LE를 읽습니다.

Excel 2007에서 CSV를 올바르게 해석할 수 있는 것은 적절한 바이트 순서 마크부터 탭으로 구분된 리틀 엔디안 UTF-16 뿐입니다.

출력 CSV 파일에 BOM을 쓰는 것은 실제로 Django에서 효과가 있었습니다.

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 감사합니다!

Windows Code Page 1252(Windows-1252 CP1252)를 참조하십시오.를 들어, ,, 를, 정, 에, 정, 정, 정, 정, 정, 정, 정, 정, this, this, this, this, this, this, this, this, this, thisContent-Type 알맞게text/csv; charset=Windows-1252응답 스트림의 문자 인코딩을 동일하게 설정합니다.

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

파일을 생성하는 인코딩을 체크하여 Excel에 파일이 올바르게 표시되도록 하려면 시스템 기본 코드 페이지를 사용해야 합니다.

당신은 어떤 언어를 사용하고 있습니까?이면.Net Encoding만 사용하면 됩니다.파일 생성 중 기본값입니다.

저처럼 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()

나는 그 문제를 해결할 방법을 찾았다.이것은 고약한 해킹이지만 효과가 있습니다.Open Office에서 문서를 열고 임의의 Excel 형식으로 저장합니다..xls ★★★★★★★★★★★★★★★★★」.xlsx강조 표시된 문자가 표시됩니다.

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]

Encode에서 notepad++ clic을 사용하여 파일 csv를 열고 UTF-8로 변환(BOM 없이 UTF-8로 변환하지 않음) Christophe GRISON을 지원하는 Excel을 사용하여 더블 clic으로 저장합니다.

언급URL : https://stackoverflow.com/questions/155097/microsoft-excel-mangles-diacritics-in-csv-files