JSON Toolkit

האם BOM שובר את פירוס JSON

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

מתחילכ-4 דקות קריאהפורסם 2026-10-30עודכן 2026-10-30
איך BOM שובר פירוס JSON ואיך מסירים אותו

שורה תחתונה: בדקו את שלושת הבייטים הראשונים עבור 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 — זה זול בהרבה מלאבחן את זה אחר כך.

קריאה נוספת