FoxTable使用人并不多,但是在避免不了的情况下注意尤其需要注意语言(.NET)本身与其他语言的差异。
1. .NET 的字符串本质
- VB.NET/ C# 里,String 在内存里永远是 UTF-16(Little Endian)。
- 当写 Encoding.UTF8.GetBytes(…),才会转成 UTF-8。
- 但是 MD5Encrypt 方法 其实没转 UTF-8,而是直接拿 .NET Unicode(UTF-16LE) 的字节数组去算 MD5。 所以 VB 端的输入是 UTF-16LE 编码的字节序列。
2. PHP 默认字符串处理
- PHP 里,字符串就是字节序列,没有内建“字符集”的概念。
- 源文件保存为 UTF-8 时,$orgStr 实际就是 UTF-8 字节。
- md5($str, true) 算的是 UTF-8 字节的 MD5。
👉 这就是为什么得到 不一样字符串的原因。
3. 关键对齐处理
// 关键:转成 UTF-16LE,再算 MD5(二进制) → base64
$utf16le = iconv('UTF-8', 'UTF-16LE', $orgStr);
//$utf16le = mb_convert_encoding($orgStr, 'UTF-16LE', 'UTF-8');
$result = base64_encode(md5($utf16le, true));