האם BOM שובר את פירוס JSON
שורה תחתונה: BOM של UTF-8 הוא שלושה בייטים בלתי נראים, כך ש-JSON.parse נכשל בתו הראשון ומדווח שורה 1 עמודה 1, מה שגורם לקובץ להיראות ריק או קטוע.

שורה תחתונה: בדקו את שלושת הבייטים הראשונים עבור EF BB BF ושמרו מחדש כ-UTF-8 בלי BOM; בשרת, הסירו U+FEFF מוביל לפני פירוס של כל קובץ מועלה או קובץ צד שלישי, במקום לדבג את הכשל אחר כך.
כן — וזה מייצר את שגיאת הפירוס המבלבלת מכולן, כי הקובץ נראה לגמרי תקין.
מה רואים
SyntaxError: Unexpected token in JSON at position 0
Unexpected character '\uFEFF'
התו הזה בהודעה הוא בלתי נראה. Position 0 פירושו הבייט הראשון ממש.
cat לא מציג משהו חריג. hexdump -C file.json | head -1 כן:
00000000 ef bb bf 7b 0a 20 20 22 61 22 3a 20 31 0a 7d 0a |...{ "a": 1.}.|
7b הוא {. שלושת הבייטים שלפניו הם ה-BOM.
מאיפה מגיעים BOM-ים
byte order mark היה קיים עבור UTF-16, שבו סדר הבייטים באמת השתנה. ל-UTF-8 יש סדר בייטים אחיד, כך שה-BOM הוא תקורה טהורה — ובכל זאת Notepad ב-Windows, חלק מייצואי Excel וכמה IDEs ישנים עדיין כותבים אותו כברירת מחדל.
RFC 8259 חד-משמעי: JSON שמוחלף בין מערכות חייב להיות UTF-8, והמימושים אסורים להוסיף BOM. מפרסים רשאים להתעלם מ-BOM מוביל אבל אינם חייבים. דפדפנים ו-Node בוחרים שלא.
שלוש דרכים להיפטר ממנו
שמרו בלי BOM. ב-VS Code, לחצו על הקידוד בשורת המצב ובחרו "Save with Encoding → UTF-8", לא "UTF-8 with BOM".
הסירו אותו מה-shell.
sed -i '1s/^\xEF\xBB\xBF//' data.json
הסירו אותו בקריאה. זה התיקון העמיד לכל דבר שמקבל קבצים מועלים או של צד שלישי:
const text = require('node:fs').readFileSync('data.json', 'utf8').replace(/^\uFEFF/, '');
JSON.parse(text);
ב-Python, open(path, encoding='utf-8-sig') מטפל בזה אוטומטית.
שתי בעיות דומות למראה
- רווח ברוחב אפס (U+200B) — נלקח כשמעתיקים JSON מדף אינטרנט; תסמין זהה, נקודת קוד שונה.
- גרשיים ברוחב מלא — IME סיני הופך
"key"ל-“key”, שנראה כמעט זהה אבל נכשל כ-Unexpected token “.
שלושתם באגים של תווים בלתי נראים. האבחון תמיד אותו דבר: שפכו את הבייטים הראשונים ב-hex במקום לבהות בטקסט.
שאלות ותשובות
איך אפשר לדעת אם קובץ מתחיל ב-BOM?
cat לא מציג כלום, אז הריצו hexdump -C file.json | head -1. אם הפלט מתחיל ב-ef bb bf, לקובץ יש BOM; 7b (ה-{) אמור לבוא ראשון בקובץ UTF-8 נקי.
למה השגיאה תמיד מצביעה על שורה 1, עמודה 1?
ה-BOM יושב לפני כל דבר אחר, כך שהתו הראשון שהמפרס קורא הוא U+FEFF. הכשל נופל אפוא בתחילת הקובץ, מה שגורם לקובץ להיראות ריק.
האם להסיר את ה-BOM לפני הפירוס?
כן. כששרת קורא קונפיגורציה או מפרס קבצים מועלים, הסירו קודם U+FEFF מוביל — replace(/^\uFEFF/, '') ב-Node, encoding='utf-8-sig' ב-Python — זה זול בהרבה מלאבחן את זה אחר כך.