node.js和.NET中的utf8编码差异

m1m5dgzv  于 2023-08-04  发布在  Node.js
关注(0)|答案(1)|浏览(90)

我有一个字节数组,我想用UTF-8编码得到一个字符串,但我在node.js和. NET中得到不同的结果。
节点:

// node.js
const b7 = Buffer.from([65, 119, 212, 250, 152, 244, 166 ]).toString();
b7.length === 7; // true
b7 === 'Aw�����' // true

字符串
.NET:

// C# .NET
byte[] b6 = new byte[7] { 65, 119, 212, 250, 152, 244, 166 };
UTF8Encoding encoding = new UTF8Encoding();
string s6 = encoding.GetString(b6);
s6.length == 6; // true
s6 == "Aw����"; // true


1.如何在node.js中获得与.NET相同的结果?
1.为什么.NET版本更短?

更新

另一个被证明很重要的信息是.Net目标。上面的.NET代码是使用.NET Framework 4.6.1的Web应用程序的一部分

taor4pac

taor4pac1#

字节数组中的字符串在Node.js和.NET中具有不同长度和内容的原因是因为它们处理无效或不可解码的UTF-8序列的方式不同。
当你在Node.js中使用Buffer.from([...]).toString()时,它不会抛出错误或替换无效序列。相反,它将每个无效字节显示为字符串中的“替换字符”(�)。
另一方面,当您在.NET中使用UTF8Encoding.GetString(byte[])时,它会将字符串中的无效字节替换为Unicode“替换字符”(U+FFFD)。但是,这个Unicode字符不计入字符串长度,因此.NET中的字符串更短。
如果你想在Node.js和.NET之间有相同的行为,你可以指定在将无效字节转换为字符串时如何处理它们。
在Node.js中,您可以使用Buffer.from([...]).toString('utf-8')并传递'utf-8'作为编码参数,以遵循UTF-8标准来处理无效序列。
在.NET中,您可以使用Encoding.UTF8.GetString(byte[],int,int),并将EncoderFallback参数设置为EncoderFallback.ReplacementFallback,以匹配Node.js处理无效序列的行为。
以下是如何修改代码以实现一致的行为:
Node.js:

const b7 = Buffer.from([65, 119, 212, 250, 152, 244, 166]).toString('utf-8');
console.log(b7.length); // 6
console.log(b7); // "Aw����"

字符串
.NET:

byte[] bb6 = new byte[7] { 65, 119, 212, 250, 152, 244, 166 };
UTF8Encoding encoding = new UTF8Encoding();
string s6 = encoding.GetString(bb6, 0, bb6.Length);
Console.WriteLine(s6.Length); // 6
Console.WriteLine(s6); // "Aw����"


通过显式指定无效序列的编码和处理,您可以确保Node.js和.NET之间的UTF-8解码行为一致。

相关问题