字符编码与转义
字符编码:JSON 用什么编码?
什么是字符编码?
字符编码就是电脑存储和传输文字的方式。就像不同国家的人说不同语言,电脑也需要"约定"用哪种方式来理解文字。
JSON 的编码规则
根据 RFC 8259 规范:
JSON 文本必须使用 UTF-8 编码。
UTF-8 是目前世界上最通用的字符编码,它可以表示:
- 英文字母、数字
- 中文、日文、韩文
- 阿拉伯文、俄文、希腊文
- 各种表情符号
- 世界上几乎所有的文字
为什么用 UTF-8?
| 编码 | 支持中文? | 通用性 |
|---|---|---|
| UTF-8 | ✅ 支持 | 🌍 全世界通用 |
| GBK | ✅ 支持 | 🇨🇳 主要在中国用 |
| ASCII | ❌ 不支持 | 🇺🇸 只支持英文 |
| UTF-16 | ✅ 支持 | 部分系统用 |
💡 UTF-8 是互联网的事实标准。用 UTF-8 编码的 JSON,任何系统都能正确读取。
实际影响
当你保存一个 .json 文件时,请确保用 UTF-8 编码保存。如果用其他编码(如 GBK),中文可能会变成乱码:
❌ GBK 编码在其他系统打开:
广州飞翔科技 →
✅ UTF-8 编码在任何系统打开:
广州飞翔科技 → 广州飞翔科技
字节顺序标记(BOM)
什么是 BOM?
BOM(Byte Order Mark)是放在文件开头的一个特殊标记,用来告诉程序"这个文件是 UTF-8 编码"。
JSON 的规定
RFC 8259 明确规定:
传输 JSON 文本时,不得在开头添加 BOM。
但同时又规定:
解析 JSON 的程序可以忽略 BOM,而不是报错。
总结:
- 生成 JSON 时:不要加 BOM
- 解析 JSON 时:如果遇到了 BOM,忽略它
实际建议
大多数现代编辑器(VS Code、Notepad++、Sublime)保存 UTF-8 时都有选项:
- ✅ UTF-8(推荐,不带 BOM)
- ❌ UTF-8 with BOM(不推荐)
转义字符详解
为什么需要转义?
有些字符在 JSON 中有特殊含义,如果直接写在字符串里,程序会"误会"。转义就是告诉程序:"请把我当成普通字符处理。"
必须转义的字符
根据 RFC 8259,以下字符必须转义:
| 字符 | 名称 | 转义写法 | 原因 |
|---|---|---|---|
" | 双引号 | \" | 会结束字符串 |
\ | 反斜杠 | \\ | 会启动转义 |
| U+0000 ~ U+001F | 控制字符 | \n、 \t 等 | 不可见字符 |
常用转义序列
| 转义 | 代表 | 说明 | 使用场景 |
|---|---|---|---|
\" | " | 双引号 | 引用别人说的话 |
\\ | \ | 反斜杠 | Windows 路径 |
\n | 换行 | Line Feed | 多行文本 |
\r | 回车 | Carriage Return | Windows 换行 |
\t | 制表符 | Tab | 对齐文本 |
\b | 退格 | Backspace | 很少用 |
\f | 换页 | Form Feed | 很少用 |
\/ | / | 斜杠 | 可选,HTML 标签中常用 |
转义实战示例
示例 1:包含引号的标语
{
"slogan": "鸣哥说:\"写文案写到秃头但永远热血!\"",
"response": "翼王回:\"开会我喜欢拍桌子。\""
}
示例 2:Windows 文件路径
{
"configPath": "C:\\Users\\AOXIANG\\Documents\\kimi\\workspace",
"logPath": "D:\\WorkStation\\feixiang-it-v2\\logs",
"sharedPath": "\\\\192.168.1.100\\shared\\docs"
}
💡 每个反斜杠都要写成
\\。路径C:\Users在 JSON 里要写C:\\Users。
示例 3:多行地址
{
"address": "北京市朝阳区前程似锦路88号\\n飞翔中文苑18栋6层",
"shippingAddress": "广东省广州市天河区\\n飞翔科技园\\n技术部 航仔 收"
}
显示效果:
北京市朝阳区前程似锦路88号
飞翔中文苑18栋6层
示例 4:制表符对齐
{
"table": "姓名\\t部门\\t职位\\n航仔\\t技术部\\t后端开发\\n图妹\\t产品部\\t产品经理"
}
显示效果:
姓名 部门 职位
航仔 技术部 后端开发
图妹 产品部 产品经理
Unicode 转义
用 Unicode 表示任意字符
JSON 支持用 \u 加上 4 位十六进制数来表示任何 Unicode 字符:
{
"char1": "\u98de",
"char2": "\u7fd4",
"company": "\u98de\u7fd4\u4e2d\u6587\u7f51"
}
\u98de= 飞\u7fd4= 翔\u4e2d= 中\u6587= 文\u7f51= 网
所以 "\u98de\u7fd4\u4e2d\u6587\u7f51" 就是 "飞翔中文网"。
什么时候用 Unicode 转义?
| 场景 | 建议 |
|---|---|
| 正常写中文 | 直接写 "飞翔",不要用 Unicode |
| 特殊控制字符 | 用 Unicode,如 \u0000 |
| 某些系统不支持中文输入 | 用 Unicode |
| 需要确保传输安全 | 可以用 Unicode |
扩展字符(Emoji 等)
对于超出基本平面的字符(如某些 Emoji),需要用 UTF-16 代理对 表示:
{
"emoji": "\uD83D\uDE00"
}
\uD83D\uDE00 表示 😀(笑脸 Emoji)。
💡 实际开发中,如果系统支持,直接写 Emoji 更直观:
"emoji": "😀"
常见错误
| 错误写法 | 问题 | 正确写法 |
|---|---|---|
"C:\Users\name" | 反斜杠未转义 | "C:\\Users\\name" |
"他说:"你好"" | 内部引号未转义 | "他说:\"你好\"" |
一句话总结
提示
JSON 必须用 UTF-8 编码,不要加 BOM。字符串里的双引号用 \"、反斜杠用 \\、换行用 \n。Unicode 转义 \uXXXX 能表示任何字符,但中文直接写更方便!