JSON Toolkit

למה סינית הופכת ל-\u4e2d\u6587

שורה תחתונה: קידוד \u4e2d\u6587 הוא Unicode חוקי, לא כשל בקידוד. שיבוש תווים אמיתי נראה אחרת, וההבחנה ביניהם קובעת מה באמת צריך לתקן.

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

שורה תחתונה: התייחסו לפלט \uXXXX כקידוד חוקי, ודאו שהוא עובר הלוך ושוב דרך JSON.parse, וכבו סריאליזציית ASCII טהור כמו ensure_ascii=False כשאתם רוצים סינית קריאה; השאירו קידוד רק לערוצים שלא יכולים לשאת תווים שאינם ASCII.

כי הוא קודד, לא ניזוק.

JSON.parse('"\\u4e2d\\u6587"')  // "中文"

\u4e2d הוא 中 ו-\u6587 הוא 文. אלה רצפי קידוד חוקיים; כל מפרס משחזר אותם. שום דבר לא שבור — זה פשוט לא קריא בלוגים, בדיפים ובלכידות מנות.

מי מבצע את הקידוד

כלי ברירת מחדל מתג
Python json.dumps מקדד (ensure_ascii=True) ensure_ascii=False
JavaScript JSON.stringify בלי קידוד —
Java Jackson בלי קידוד אופציונלי
PHP json_encode בלי קידוד מאז 5.4 —
Go encoding/json בלי קידוד —

Python הוא המקור הנפוץ ביותר בהרבה. ברירת המחדל קיימת מסיבה: פלט ASCII טהור שורד כל ערוץ. המחיר הוא שכל תו שאינו ASCII הופך לשישה תווים.

קידוד לעומת שיבוש תווים

קידוד: \u4e2d\u6587, מתאים ל-\uXXXX. נגרם מהגדרות הסריאליזטור. שיבוש תווים: 测试, 涓枃. נגרם מכתיבת בייטים של UTF-8 וקריאתם כ-Latin-1 או GBK.

בדיקה מהירה: הדביקו את הטקסט בקונסולת דפדפן כ-JSON.parse('"…"'). אם הוא חוזר קריא, זה היה קידוד. אם הוא נכשל או נשאר משובש, זה חוסר התאמה בקידוד — והתיקון הוא להתאים את הקידודים, לא לגעת בסריאליזטור.

כיבוי הקידוד

json.dumps(data, ensure_ascii=False)

ואז ודאו בהמשך הזרימה: כמה מערכות ישנות באמת מסתמכות על העברה של ASCII בלבד, במיוחד שערי SMS וממסרי דואר ישנים.

מתי קידוד הוא הבחירה הנכונה

  • ערוצים עוינים לתווים שאינם ASCII (כותרות HTTP ישנות, חלק משערי SMS)
  • JSON שמקונן בתוך מחרוזת JSON אחרת, שבה קידוד מצמצם התנגשויות גרשיים
  • pipelines של לוגים שקוצצים לפי בייטים והיו מפצלים תו מרובה-בייטים

אחרת, העדיפו קריאות וכבו אותו.

שאלות ותשובות

למה Python מקדד סינית כברירת מחדל?

כי ensure_ascii=True היא ברירת המחדל, שמבטיחה פלט ASCII טהור ששורד כל ערוץ. המחיר הוא שכל תו שאינו ASCII הופך לשישה תווים.

האם לכבות את ensure_ascii?

כבו אותו כשקריאות חשובה. אז ודאו בהמשך הזרימה — כותרות HTTP ישנות, חלק משערי SMS ו-pipelines של לוגים שקוצצים לפי בייטים עדיין עשויים להסתמך על תוכן ASCII בלבד.

מה קורה אם הערוץ לא יכול לשאת תווים שאינם ASCII?

השאירו את הקידוד. כש-JSON מוטמע בתוך מחרוזת JSON אחרת, או עובר בערוץ עוין לתווים שאינם ASCII, קידוד מונע התנגשויות גרשיים ומונע פיצול של תווים מרובי-בייטים.

קריאה נוספת