文字與開發者 指南

CSV 在 Excel 開啟中文亂碼怎麼辦?UTF-8、BOM、分隔符與匯入完整指南

中文亂碼、欄位全部擠在一起、00123 變 123,其實是三種不同問題:encoding、delimiter 與型別推論。

更新日期:

你有一份 CSV:

姓名,城市
王小明,台北

在文字編輯器看完全正常,但雙擊用 Excel 開啟後可能出現:

  • 中文亂碼;
  • 所有欄位擠在第一欄;
  • 00123123
  • 長 ID 變科學記號;
  • 日期自動改格式。

這些問題常被全部叫做「CSV 亂碼」,但其實不是同一件事。

速答:CSV 在 Excel 中文亂碼怎麼辦? 先確認檔案實際 encoding 是否為 UTF-8;若使用「直接雙擊開啟」的工作流,UTF-8 BOM 常能提高部分 Excel 版本辨識 UTF-8 的相容性。若欄位全部擠在同一欄,通常是 delimiter 不符;若前導零、長 ID 或日期被改,則是 Excel 自動型別推論。最穩定的方式是使用 Excel 的 Data / From Text/CSV 匯入,明確選擇 UTF-8、delimiter 與欄位型別,而不是只靠雙擊猜測。

一、先分清楚三種常見問題

問題 A:中文變亂碼

多半是 encoding interpretation。

問題 B:所有資料在第一欄

多半是 delimiter。

問題 C:00123 變 123

多半是 type inference。

不要只靠加 BOM 解決所有問題。

二、UTF-8 是什麼?

UTF-8 是 Unicode 的常見字元編碼方式。

它可以表示:

  • 中文;
  • 英文;
  • Emoji;
  • 多語言字元。

CSV 本身不規定「只准某一種 encoding」。真正能否正確顯示,取決於產生端與讀取端是否對 encoding 有一致理解。

三、BOM 是什麼?

BOM = Byte Order Mark。

UTF-8 BOM 常見 bytes:

EF BB BF

在 UTF-8 中它不是用來表示 byte order 的必要資訊,但很多軟體會把它當作:

「這是 UTF-8」的 signature / hint。

四、為什麼 Excel 直接開啟時 BOM 有幫助?

某些 Windows / Excel 工作流若沒有 BOM,可能依 locale 猜成其他 encoding。

加入 UTF-8 BOM 後:

更容易被辨認為 UTF-8。

因此 FunnyTools JSON to CSV 現行下載選項提供 UTF-8 BOM。

五、BOM 是不是永遠要加?

不是。

有些:

  • API;
  • parser;
  • Unix pipeline;
  • database import

可能明確要求:

UTF-8 without BOM。

所以 BOM 是 compatibility choice,不是「CSV 正確答案」。

六、最穩定的方法:不要只靠雙擊

在 Excel 使用:

Data → From Text/CSV

可以明確選:

  • File origin / encoding;
  • delimiter;
  • preview;
  • 欄位型別。

這比讓 Excel 自己猜更可控。

七、所有欄位都在第一欄是什麼原因?

CSV 內容:

name,score,city

但 Excel locale 可能期待 semicolon:

name;score;city

若 delimiter 判斷不一致,整行就可能落在同一格。

這不是字元 encoding 問題。

八、逗號和分號怎麼選?

依:

  • 來源系統;
  • locale;
  • 目標 Excel;
  • 下游 parser

決定。

FunnyTools JSON to CSV 支援 separator 選擇,就是為了解決這類差異。

九、欄位內本來就有逗號怎麼辦?

例如地址:

Taipei, Taiwan

正確 CSV 應 quoting:

"Taipei, Taiwan"

不能因為 Excel 跑欄就直接把資料裡的逗號刪掉。

十、前導零為什麼消失?

CSV:

00123

Excel 自動當 number 後顯示:

123

這是型別推論,不是 encoding。

郵遞區號、學號、產品代碼、電話等欄位應在匯入時指定:

Text。

十一、長 ID 為什麼變科學記號?

例如:

123456789012345678

Excel 可能顯示:

1.23457E+17

甚至可能因數值精度而改變尾數。

如果它是 ID,不是數量:

應匯入為 Text。

十二、日期為什麼自動改格式?

CSV:

01-02

可能被 Excel 當日期。

產品代碼、版本號、月份代碼等也可能被錯誤推論。

因此重要資料不要只靠雙擊。

十三、UTF-8 檔案在文字編輯器正常,Excel 亂碼代表什麼?

這通常表示:

檔案 bytes 可能是正確 UTF-8,但 Excel 開啟時用了錯誤 encoding。

這種情況下:

  • 加 BOM;
  • 用 Data Import 指定 UTF-8

通常比重新轉資料更合理。

十四、如果來源本身已經是亂碼,BOM 救不了

例如原資料已經變成:

王小明

再加 BOM 不會神奇恢復。

你必須找到:

原始 bytes + 正確 encoding。

Encoding 問題要在最早錯誤解碼處修復。

十五、Big5、ANSI、CP950 怎麼辦?

舊系統可能仍輸出 Big5 / CP950 等編碼。

如果你知道來源:

應以正確 encoding 讀取,再轉 UTF-8。

不要把錯誤解碼後的文字再「另存 UTF-8」;那只會把亂碼正式保存。

十六、Emoji 為什麼在舊 CSV 工作流特別容易壞?

舊編碼不一定能表示 Emoji。

如果 pipeline 中任何一段:

  • Big5;
  • ANSI;
  • 非 Unicode database column

無法表示,就可能丟失。

UTF-8 end-to-end 才能可靠保留。

十七、CSV 轉 JSON 前也要先解決 encoding

如果 CSV 文字已亂碼:

轉 JSON 只會得到「JSON 格式的亂碼」。

因此順序:

  1. 正確 decode CSV;
  2. 確認中文;
  3. 再 CSV → JSON。

十八、JSON → CSV 給 Excel 的推薦設定

一般中文 Excel 工作流可以考慮:

  • UTF-8;
  • BOM on;
  • 適合 locale 的 delimiter;
  • Formula Protection on;
  • 再用 Excel 實際打開測試。

如果下游系統有明確 spec,則以 spec 為準。

十九、Formula-like value 和亂碼是不同安全問題

值:

=1+1

中文顯示正常,不代表安全。

Excel 可能把它當公式。

因此 JSON→CSV 還要另外考慮 CSV / Formula Injection。

二十、最終驗證清單

  • 中文正常
  • Emoji 正常
  • 欄位數正確
  • delimiter 正確
  • 逗號欄位沒有跑欄
  • 前導零保留
  • 長 ID 沒被改
  • 日期沒被誤轉
  • formula-like text 已檢查
  • row count 正確

二十一、常見錯誤

錯誤 1:所有問題都叫亂碼

應分 encoding / delimiter / type inference。

錯誤 2:只加 BOM 不檢查 delimiter

欄位可能仍擠在一格。

錯誤 3:雙擊 CSV 就當最終驗證

Excel 可能自動猜型別。

錯誤 4:來源已亂碼還一直另存 UTF-8

只會固化錯誤。

錯誤 5:把 ID 當 number

可能失去前導零或精度。

二十二、FAQ

UTF-8 CSV 一定需要 BOM 嗎?

不一定;BOM 是相容性提示,依目標程式決定。

為什麼 Excel 全部塞在第一欄?

多半是 delimiter 判斷不符,不是 encoding。

00123 為什麼變 123?

Excel 自動當 number。

長 ID 為什麼變 E+17?

Excel 以數值/科學記號處理,應匯入為 Text。

加 BOM 可以救已經亂掉的文字嗎?

不行,來源若已錯誤 decode,需要回到原始 bytes 修正。

二十三、延伸閱讀

下一步

CSV 給 Excel 前先測一次真正匯入流程。 中文亂碼、欄位擠在一起與前導零消失是不同問題,要分開修。

重點速記

CSV problem → Encoding? Delimiter? Type inference? → Import explicitly → Verify values