Mengapa teks Tionghoa berubah menjadi \u4e2d\u6587
Intinya: Escape \u4e2d\u6587 adalah Unicode yang legal, bukan kegagalan encoding. Mojibake sungguhan tampak berbeda, dan membedakan keduanya menentukan apa yang sebenarnya perlu Anda perbaiki.

Intinya: perlakukan output \uXXXX sebagai escaping yang legal, pastikan ia kembali utuh melalui JSON.parse, dan matikan serialisasi ASCII murni seperti ensure_ascii=False ketika Anda ingin teks Tionghoa yang terbaca; pertahankan escaping hanya untuk transport yang tidak dapat membawa non-ASCII.
Karena teksnya di-escape, bukan dirusak.
JSON.parse('"\\u4e2d\\u6587"') // "中文"
\u4e2d adalah 中 dan \u6587 adalah 文. Ini urutan escape yang legal; parser apa pun memulihkannya. Tidak ada yang rusak — hanya saja tidak terbaca di log, diff dan packet capture.
Siapa yang melakukan escaping
| Alat | Default | Saklar |
|---|---|---|
Python json.dumps |
Melakukan escape (ensure_ascii=True) |
ensure_ascii=False |
JavaScript JSON.stringify |
Tanpa escaping | — |
| Java Jackson | Tanpa escaping | Opsional |
PHP json_encode |
Tanpa escaping sejak 5.4 | — |
Go encoding/json |
Tanpa escaping | — |
Python sejauh ini adalah sumber paling umum. Default itu ada alasannya: output ASCII murni bertahan di transport apa pun. Biayanya adalah setiap karakter non-ASCII menjadi enam karakter.
Escaping versus mojibake
Escaping: \u4e2d\u6587, cocok dengan \uXXXX. Disebabkan oleh pengaturan serializer.
Mojibake: 测试, 涓枃. Disebabkan oleh menulis byte UTF-8 lalu membacanya sebagai Latin-1 atau GBK.
Uji cepat: tempel teks ke konsol browser sebagai JSON.parse('"…"'). Jika hasilnya kembali terbaca, itu escaping. Jika gagal atau tetap rusak, itu ketidakcocokan encoding — dan perbaikannya adalah menyelaraskan encoding, bukan menyentuh serializer.
Mematikannya
json.dumps(data, ensure_ascii=False)
Lalu verifikasi di hilir: sebagian sistem lama memang bergantung pada transport ASCII-only, khususnya gateway SMS dan relay email lama.
Kapan escaping adalah pilihan yang tepat
- Transport yang bermusuhan dengan non-ASCII (header HTTP lama, sebagian gateway SMS)
- JSON yang disematkan di dalam string JSON lain, di mana escaping mengurangi konflik tanda kutip
- Pipeline log yang memotong berdasarkan byte dan akan memecah karakter multi-byte
Selain itu, utamakan keterbacaan dan matikan.
FAQ
Mengapa Python meng-escape teks Tionghoa secara default?
Karena ensure_ascii=True adalah default, yang menjamin output ASCII murni yang bertahan di transport apa pun. Biayanya adalah setiap karakter non-ASCII menjadi enam karakter.
Haruskah saya mematikan ensure_ascii?
Matikan bila keterbacaan penting. Lalu verifikasi di hilir — header HTTP lama, sebagian gateway SMS dan pipeline log yang memotong berdasarkan byte mungkin masih bergantung pada konten ASCII-only.
Apa yang terjadi jika transport tidak dapat membawa non-ASCII?
Pertahankan escaping. Ketika JSON disematkan di dalam string JSON lain, atau melewati kanal yang bermusuhan dengan non-ASCII, escaping menghindari konflik tanda kutip dan mencegah karakter multi-byte terpecah.