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

שורה תחתונה: התייחסו לפלט \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, קידוד מונע התנגשויות גרשיים ומונע פיצול של תווים מרובי-בייטים.