资讯动态

从 UTF-16 码元到原生 char*:P/Invoke 字符串封送的完整编码链路

发布时间:2026/10/24 4:15:31 来源:尧图企业网站定制
一、先把四个概念钉死:字符、码点、码元、字节1.1 C++ 的char*不携带任何编码信息在 C++ 侧,一个字符串参数通常长这样:void set_name(const char* name);这个签名没有告诉我们任何编码约定——UTF-8、GBK 还是本地代码页,全靠双方在文档里口头对齐。const char*在 C++ 语义里只承诺「一串字节、以 0 结尾」,它对「这串字节代表什么字符」完全沉默。C# 侧却截然不同:public sealed class PlayerInfo { public string Nickname; // 语义上是一串 Unicode 字符 }System.String在 .NET 里是UTF-16 码元(code unit)序列,每个元素占 2 字节,且不可变。于是「C# string 变成 C++ char*」这件事的本质,根本不是「取个地址」,而是:把一段 UTF-16 码元序列,按某种编码规则重新解释成一串字节,再把这串字节的地址交出去。这句话里有四个可分离的环节:解析、编码、终止符、生命周期。任何一环没约定清楚,跨语言调用就会在某个看似无关的地方炸掉。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑