Skip to content

Como abrir e salvar corretamente CSV no Excel | Compatível com UTF-8 BOM sem caracteres corrompidos

Categoria:Processamento de dados・Excel
Este artigo está disponível atualmente apenas em japonês. As versões traduzidas serão publicadas sequencialmente.

「Ao abrir um arquivo CSV exportado do sistema no Excel, os caracteres japoneses foram distorcidos」——este problema é um incômodo que ocorre diariamente em ambientes de desenvolvimento web, análise de dados e sistemas de negócios. A causa está principalmente na diferença entre os conjuntos de caracteres UTF-8 e Shift_JIS(CP932). Este artigo explica sistematicamente desde a raiz da distorção de caracteres, passando pela solução com CSV com BOM UTF-8, procedimentos de importação no Excel, métodos de implementação em PHP e Python, até problemas com códigos de quebra de linha.

Fluxo de solução de caracteres corrompidos no Excel e CSV UTF-8 CSV Saída Web BOM? EF BB BF Caracteres distorcidos 縺ゅ>縺・▲ ... Exibição normal あいうえお No Yes Método de resolução 1. Saída com BOM UTF-8 (adição de 3 bytes no início) 2. Usar o Assistente de Importação de Dados do Excel 3. Converter e exibir em Shift_JIS (CP932) (legado) Excel para Mac tem reconhecimento de BOM instável — UTF-8 LF recomendado
Figura 1: Detecção de caracteres corrompidos e caminho de solução ao abrir CSV UTF-8 no Excel

Problema do Excel esperando Shift_JIS por padrão

O Excel para Windows detecta automaticamente a codificação com base nas configurações de localidade do SO ao abrir arquivos CSV com clique duplo. No Windows em japonês, essa codificação padrão é <strong>Shift_JIS (página de código 932)</strong>.

Portanto, ao abrir um arquivo CSV salvo em UTF-8 com um duplo clique, caracteres multibyte (como japonês) não são interpretados corretamente, resultando em caracteres corrompidos. Este é o motivo pelo qual o problema 「um engenheiro gerou um CSV em UTF-8 em um sistema Web e um funcionário não-engenheiro o abriu no Excel, resultando em corrupção de caracteres」 ocorre repetidamente.

Quando organizamos as relações de correspondência de codificação, obtemos o seguinte.

Codificação de caracteres Alias Como lidar no Excel Manipulação em Web/Linux
Shift_JIS CP932、Windows-31J Padrão na versão em japonês Legado. Uso não recomendado
UTF-8 (sem BOM) Caracteres distorcidos (versão antiga) Padrões Web
Com BOM UTF-8 UTF-8 with BOM Reconhecido corretamente A BOM também pode causar problemas como um caractere indesejado
UTF-16 LE com BOM Reconhecido corretamente Raramente usado

Como evitar caracteres corrompidos em CSV com BOM UTF-8

A BOM (Byte Order Mark) é uma sequência especial de bytes adicionada ao início do arquivo que funciona como uma assinatura para identificar a codificação de caracteres do arquivo de texto. A BOM UTF-8 é composta por 3 bytes: <code>EF BB BF</code> (hexadecimal).

O Excel detecta esta BOM ao abrir o arquivo e conclui que「este arquivo foi escrito em UTF-8」. Esta é a razão pela qual <strong>usar CSV com BOM UTF-8 evita caracteres corrompidos no Excel</strong>.

Para verificar a diferença entre UTF-8 com BOM e UTF-8 sem BOM, verifique os bytes iniciais do arquivo usando um editor de texto ou o comando <code>hexdump</code>.

# Linux / macOS での確認
hexdump -C sample.csv | head -1

# BOM なし UTF-8 の出力例:
# 00000000  e5 90 8d e5 89 8d 2c e5  ...
# BOM 付き UTF-8 の出力例:
# 00000000  ef bb bf e5 90 8d e5 89  ...(先頭に ef bb bf)

Procedimento para importar de 「Dados」→「Arquivo de texto」 no Excel

Para abrir corretamente um CSV UTF-8 sem BOM no Excel, use a função 「Importar Dados」 em vez de dar duplo clique. Os passos variam de acordo com a versão, mas no Excel 2016 e posteriores (incluindo Microsoft 365) você pode usar os seguintes passos.

  1. Inicie o Excel e abra uma nova pasta de trabalho.
  2. Clique na aba 「Dados」 → 「De Texto ou CSV」.
  3. Selecione o arquivo CSV de destino e clique em 「インポート」.
  4. A tela de visualização é exibida. Selecione <strong>65001: Unicode (UTF-8)</strong> no menu suspenso 「Origem do arquivo」.
  5. Confirme que o delimitador está definido como 「vírgula」 e clique em 「Carregar」.

Para Excel 2013 ou anterior, use 「Dados」→「Importar dados externos」→「Arquivo de texto」 e altere a codificação de caracteres para UTF-8 (65001) na etapa 2 do 「Assistente de arquivo de texto」.

Código para gerar CSV com BOM UTF-8 em PHP

Ao fazer download de CSV de um sistema web, a maneira mais simples é gerar um CSV UTF-8 com BOM usando PHP.

// UTF-8 BOM 付き CSV のダウンロード出力
function outputCsvWithBom(array $headers, array $rows, string $filename = 'export.csv'): void
{
    // キャッシュ無効化・ダウンロードヘッダーを設定
    header('Content-Type: text/csv; charset=UTF-8');
    header('Content-Disposition: attachment; filename="' . $filename . '"');
    header('Cache-Control: no-cache, no-store, must-revalidate');

    $output = fopen('php://output', 'w');

    // UTF-8 BOM を出力(EF BB BF)
    fputs($output, "\xEF\xBB\xBF");

    // ヘッダー行を出力
    fputcsv($output, $headers);

    // データ行を出力
    foreach ($rows as $row) {
        fputcsv($output, $row);
    }

    fclose($output);
    exit;
}

// 使用例
$headers = ['名前', 'メールアドレス', '登録日'];
$rows = [
    ['山田 太郎', 'taro@example.com', '2026-04-14'],
    ['鈴木 花子', 'hanako@example.com', '2026-04-13'],
];

outputCsvWithBom($headers, $rows, 'users_' . date('Ymd') . '.csv');

Observe que <code>fputcsv()</code> usa separação por vírgula e escape com aspas duplas por padrão. Se você deseja alterar o caractere delimitador, pode especificá-lo no terceiro argumento (exemplo: para separação por tabulação, use <code>"\t"</code>).

Código de conversão de codificação de caracteres em Python

Python é útil para converter a codificação de arquivos CSV existentes ou converter dados recebidos em Shift_JIS para UTF-8.

import csv
import codecs

# BOM なし UTF-8 → BOM 付き UTF-8 に変換して保存
def add_bom_to_utf8_csv(input_path: str, output_path: str) -> None:
    with open(input_path, 'r', encoding='utf-8') as infile:
        content = infile.read()

    with open(output_path, 'w', encoding='utf-8-sig') as outfile:
        # 'utf-8-sig' は自動的に BOM を付加する
        outfile.write(content)


# Shift_JIS CSV → UTF-8 BOM 付き CSV に変換
def convert_sjis_to_utf8_bom(input_path: str, output_path: str) -> None:
    with open(input_path, 'r', encoding='shift_jis', errors='replace') as infile:
        rows = list(csv.reader(infile))

    with open(output_path, 'w', encoding='utf-8-sig', newline='') as outfile:
        writer = csv.writer(outfile)
        writer.writerows(rows)


# 文字コードを自動検出して変換(chardet を使用)
# pip install chardet
import chardet

def detect_and_convert(input_path: str, output_path: str) -> None:
    with open(input_path, 'rb') as f:
        raw_data = f.read()

    detected = chardet.detect(raw_data)
    encoding = detected['encoding'] or 'utf-8'
    print(f'検出した文字コード: {encoding}(信頼度: {detected["confidence"]*100:.0f}%)')

    content = raw_data.decode(encoding, errors='replace')

    with open(output_path, 'w', encoding='utf-8-sig', newline='') as outfile:
        outfile.write(content)

Ao especificar <code>encoding='utf-8-sig'</code> em <code>open()</code> do Python, a BOM é adicionada automaticamente ao escrever e removida automaticamente ao ler.

Pontos de atenção do Excel para macOS

No Excel para macOS (Microsoft 365 for Mac), há pontos em que o comportamento diferencia da versão Windows.

  • <strong>CSV com BOM UTF-8</strong>: Abre corretamente com clique duplo no Excel do macOS (a partir de versões mais recentes).
  • <strong>Versões antigas (como Excel 2016 para Mac)</strong>: Pode haver distorção de caracteres mesmo com UTF-8 BOM. Neste caso, use 「Importar dados」.
  • <strong>Selecione CSV em 「Salvar Como」</strong>:Na versão macOS, pode ser salvo sem BOM UTF-8. É necessário confirmar novamente o CSV passado para o ambiente Windows.
  • <strong>Uso misto com Numbers.app</strong>: O Numbers do macOS trata UTF-8 como padrão, mas é necessário ter cuidado com a compatibilidade com o Excel.

Problema de código de quebra de linha (CRLF vs LF)

Além da codificação incorreta de caracteres em CSV, as diferenças nos códigos de quebra de linha também podem ser um problema.

Código de quebra de linha Sequência de bytes ambientes principais Tratamento de CSV
CRLF 0D 0A Windows、HTTP Padrão definido em RFC 4180
LF 0A Padrão do Linux, macOS e Git Na maioria dos casos, também funciona no Excel
CR 0D macOS antigo (9 ou anterior) Pode ser um problema apenas em Excel antigo

A especificação padrão de CSV, RFC 4180, especifica CRLF, mas o Excel moderno trata sem problemas CSVs contendo apenas LF. No entanto, quando um CSV contém quebras de linha dentro de campos, o tratamento do código de quebra de linha se torna importante. O PHP <code>fputcsv()</code> usa LF por padrão, mas se a compatibilidade com ambientes Windows for importante, considere converter a saída com <code>str_replace("\n", "\r\n", $output)</code> após a geração.

// PHP で CRLF 改行の CSV を出力する方法
function outputCsvCrlfWithBom(array $headers, array $rows, string $filename = 'export.csv'): void
{
    header('Content-Type: text/csv; charset=UTF-8');
    header('Content-Disposition: attachment; filename="' . $filename . '"');

    // 一旦バッファに書き出して CRLF に変換する
    ob_start();
    $output = fopen('php://output', 'w');
    fputs($output, "\xEF\xBB\xBF");
    fputcsv($output, $headers);
    foreach ($rows as $row) {
        fputcsv($output, $row);
    }
    fclose($output);
    $csv = ob_get_clean();

    // LF を CRLF に変換(すでに CRLF になっているものは除外)
    $csv = str_replace(["\r\n", "\n"], "\r\n", $csv);

    echo $csv;
    exit;
}

Resumo: Melhores práticas para distribuição de CSV sem corrupção de caracteres

  • Exporte CSV com UTF-8 BOM ao distribuir para usuários do Excel
  • Em PHP, adicione BOM no início com <code>fputs($output, "\xEF\xBB\xBF")</code>
  • Especificar <code>encoding='utf-8-sig'</code> em Python
  • Use os comandos <code>chardet</code> ou <code>file</code> para verificar a codificação de caracteres do CSV recebido
  • Ao distribuir CSV UTF-8 sem BOM para usuários do Excel, forneça orientações sobre o procedimento「Importar Dados」
  • O código de quebra de linha CRLF é padrão RFC, mas o Excel moderno também tolera LF
  • Como o Excel para macOS pode ter comportamento diferente, recomenda-se confirmar o funcionamento no lado do receptor

Arquivo de teste disponível para usar neste artigo

  • <a href="/ja/files/encoding/" class="text-primary-600 dark:text-primary-400 hover:underline">Lista de arquivos de teste de codificação de caracteres</a> — Amostras de várias codificações como UTF-8 com/sem BOM e Shift_JIS
  • <a href="/ja/files/csv/" class="text-primary-600 dark:text-primary-400 hover:underline">Lista de arquivos CSV de teste</a> — Amostras com combinações de códigos de quebra de linha, codificação de caracteres e presença/ausência de BOM
  • <a href="/ja/files/newline/" class="text-primary-600 dark:text-primary-400 hover:underline">Lista de arquivos de teste de quebra de linha</a> — Verificar cada padrão CRLF / LF / CR

Artigos relacionados

  • <a href="/ja/blog/csv-encoding-trouble-guide/" class="text-primary-600 dark:text-primary-400 hover:underline">Resolva Completamente Problemas de Codificação em CSV! Conhecimentos Fundamentais de Codificação de Caracteres, BOM e Quebras de Linha</a>
  • <a href="/ja/blog/file-format-quick-reference/" class="text-primary-600 dark:text-primary-400 hover:underline">Guia de Referência Rápida de Formatos de Arquivo para Desenvolvedores</a>
  • <a href="/ja/blog/base64-size-increase/" class="text-primary-600 dark:text-primary-400 hover:underline">Por que a codificação Base64 aumenta o tamanho do arquivo em 33%</a>

Perguntas frequentes

Por que os caracteres ficam corrompidos ao abrir CSV no Excel?

Excel lê como Shift_JIS (ambiente Windows) por padrão, causando distorção de caracteres em CSV UTF-8. Salvar com BOM UTF-8 resolve o problema.

O que é BOM (Byte Order Mark)?

A marca de 3 bytes (EF BB BF) adicionada no início do arquivo comunica ao software que é UTF-8. É necessária para que o Excel reconheça corretamente UTF-8.

Como abrir CSV corretamente no Excel para macOS?

No Excel para macOS também, é seguro usar a importação de arquivo de texto na aba Dados e especificar UTF-8 como codificação de caracteres.

📚 Reference