使用相同代码页将字节数组编码为字符串的 C# 在美国语言环境和日本语言环境中具有不同的结果
C# using same code page to encoding byte array into string has different results in US locale and Japan locale
public void foo(byte[] data)
{
var str = Encoding.GetEncoding("Windows-1252").GetString(data);
PINVOKE.DoSomething(out unmanagedPtr, str, data.length)
}
代码将字节数组转换为字符串并使用P/Invoke调用C层函数,该函数将采用无符号字符数组并创建基于字节数组的非托管对象。因为C没有字节数组,所以我必须将数据转换成字符串。
问题是此功能在 EMEA 和 NAM 的英语语言环境中运行良好,但在日本语言环境中失败。
错误是ZLIB解压错误-数据错误。输入数据已损坏。
156 'œ'、140 'Œ'(在美国语言环境中执行)映射到 63 '?' (日本地区); 226 'â' 映射到 97 'a'.
实际上我可以避免编码部分,而是将字节数组直接传递给 P\Invoke 方法。只需要更改 P\Invoke 方法的签名以使用 byte[] 而不是 string.
但我仍然想知道为什么使用相同的代码页在不同的语言环境设置下会产生不同的结果!
public void foo(byte[] data)
{
var str = Encoding.GetEncoding("Windows-1252").GetString(data);
PINVOKE.DoSomething(out unmanagedPtr, str, data.length)
}
代码将字节数组转换为字符串并使用P/Invoke调用C层函数,该函数将采用无符号字符数组并创建基于字节数组的非托管对象。因为C没有字节数组,所以我必须将数据转换成字符串。
问题是此功能在 EMEA 和 NAM 的英语语言环境中运行良好,但在日本语言环境中失败。 错误是ZLIB解压错误-数据错误。输入数据已损坏。
156 'œ'、140 'Œ'(在美国语言环境中执行)映射到 63 '?' (日本地区); 226 'â' 映射到 97 'a'.
实际上我可以避免编码部分,而是将字节数组直接传递给 P\Invoke 方法。只需要更改 P\Invoke 方法的签名以使用 byte[] 而不是 string.
但我仍然想知道为什么使用相同的代码页在不同的语言环境设置下会产生不同的结果!