第一部分:先看清三种"字符串"
要讲清楚转换,必须先知道两边的字符串根本不是一个东西。
1.1 C# 的 string
内存布局(大致): ┌──────────┬────────┬─────────────────────────┐ │ 对象头 │ 长度 │ UTF-16 字符数据 + 结尾 \0 │ │ 16 字节 │ 4 字节 │ 每个字符 2 字节 │ └──────────┴────────┴─────────────────────────┘ 特点: ① 编码是 UTF-16(每个字符 2 字节,emoji 是 4 字节) ② 长度存在头部 → 不靠 \0 判断结尾 ③ 在 GC 堆上 → ★ 地址会被 GC 移动 ④ 不可变1.2 C 的char*
就是一个裸指针: ptr ──▶ 'H' 'e' 'l' 'l' 'o' '\0' 特点: ① 编码不确定(UTF-8?GBK?Latin-1?指针本身不告诉你) ② 长度不确定 → ★ 必须一路扫到 \0 才知道 ③ 谁分配的、该谁释放 → ★ 指针也不告诉你1.3 C++ 的std::string★ 重点
这是全文最重要的一节。