.net NET中的MultibyteToWideChar和WideCharToMultiByte函数的替代方案是什么?
我正在尝试将代码从VC++迁移到.net。VC++代码使用WinAPI提供的MultiByteToWideChart和WideChart多字节函数。我尝试在.NET中使用System.Text.Encoding类,但它不适用于所有编码。是否有其他方法进行此转换?下面的代码片段有什么错误 这是我的C#代码: MultiByteToWideChar仅适用于代码页1255,不适用于866.net NET中的MultibyteToWideChar和WideCharToMultiByte函数的替代方案是什么?,.net,unicode,encoding,.net,Unicode,Encoding,我正在尝试将代码从VC++迁移到.net。VC++代码使用WinAPI提供的MultiByteToWideChart和WideChart多字节函数。我尝试在.NET中使用System.Text.Encoding类,但它不适用于所有编码。是否有其他方法进行此转换?下面的代码片段有什么错误 这是我的C#代码: MultiByteToWideChar仅适用于代码页1255,不适用于866 WideChartMultiByte不适用于代码页1251。string是字符串,而不是字节流。当您将二进制数据包
WideChartMultiByte不适用于代码页1251。
string
是字符串,而不是字节流。当您将二进制数据包装到字符串中时,您已经丢失了数据
如果要在编码之间进行正确转换,请确保使用byte[]
<代码>字符串
已经为这些字节赋予了意义。NET的string
与C的char*
不同。保留string
用于string
s,使用byte[]
用于持久化、网络等。string
是一个字符串,而不是字节流。当您将二进制数据包装到字符串中时,您已经丢失了数据
如果要在编码之间进行正确转换,请确保使用byte[]
<代码>字符串
已经为这些字节赋予了意义。NET的string
与C的char*
不同。将string
保留为string
s,并将byte[]
用于持久性、网络等。MultiByteToWideChar()
将编码字节(非字符!)转换为Unicode字符
WideCharToMultiByte()
将Unicode字符转换为编码字节(不是字符!)
在.NET中,字符串
类型始终是Unicode字符序列(UTF-16字节编码)。因此,使用string
保存编码字节是完全错误的
在MultiByteToWideChar()
函数中,假设输入的字符串
包含Unicode字符,这些字符是代码页编码的8位字节的16位表示形式。您将Unicode字符原样转换为字节[]
数组,然后将该假定的代码页编码数组转换为UTF-16字节[]
数组,然后将其转换为UTF-16字符串。当且仅当初始假设一开始为真时,这将很好地工作。通常情况并非如此,除非您的输入一开始就已损坏
在WideCharToMultiByte()
函数中,将输入的string
转换为UTF-16byte[]
数组,然后将该数组转换为代码页编码的byte[]
数组。到目前为止还不错(尽管您可以使用Encoding.GetBytes()
直接从UTF-16string
转到编码的代码页byte[]
,而根本不使用Encoding.Convert()
)。但是,您使用相同的代码页将编码的字节[]
数组转换回UTF-16字符串,从而取消您所做的一切。输出字符串
的值将与输入字符串
的值相同(前提是指定的代码页支持输入字符串
中的所有Unicode字符,否则在第一次代码页转换期间将丢失数据)
也就是说,正确的代码应该更像这样:
public static string MultiByteToWideChar(byte[] input, int codepage)
{
return Encoding.GetEncoding(codepage).GetString(input);
}
public static byte[] WideCharToMultiByte(string input, int codepage)
{
return Encoding.GetEncoding(codepage).GetBytes(input);
}
不要使用字符串
来保存编码的字节,而是使用实际的字节[]
数组。MultiByteToWideChar()
将编码的字节(不是字符!)转换为Unicode字符
WideCharToMultiByte()
将Unicode字符转换为编码字节(不是字符!)
在.NET中,字符串
类型始终是Unicode字符序列(UTF-16字节编码)。因此,使用string
保存编码字节是完全错误的
在MultiByteToWideChar()
函数中,假设输入的字符串
包含Unicode字符,这些字符是代码页编码的8位字节的16位表示形式。您将Unicode字符原样转换为字节[]
数组,然后将该假定的代码页编码数组转换为UTF-16字节[]
数组,然后将其转换为UTF-16字符串。当且仅当初始假设一开始为真时,这将很好地工作。通常情况并非如此,除非您的输入一开始就已损坏
在WideCharToMultiByte()
函数中,将输入的string
转换为UTF-16byte[]
数组,然后将该数组转换为代码页编码的byte[]
数组。到目前为止还不错(尽管您可以使用Encoding.GetBytes()
直接从UTF-16string
转到编码的代码页byte[]
,而根本不使用Encoding.Convert()
)。但是,您使用相同的代码页将编码的字节[]
数组转换回UTF-16字符串,从而取消您所做的一切。输出字符串
的值将与输入字符串
的值相同(前提是指定的代码页支持输入字符串
中的所有Unicode字符,否则在第一次代码页转换期间将丢失数据)
也就是说,正确的代码应该更像这样:
public static string MultiByteToWideChar(byte[] input, int codepage)
{
return Encoding.GetEncoding(codepage).GetString(input);
}
public static byte[] WideCharToMultiByte(string input, int codepage)
{
return Encoding.GetEncoding(codepage).GetBytes(input);
}
不要使用<代码>字符串< />代码来保存编码字节,使用实际的Byth[]/Cord>Load。
什么是不可用的,为什么你使用C++函数名来处理完全不同的东西?编码没有问题。如果您使用正确的代码页,它可以将任何内容从一种编码转换为另一种编码。西铁