Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net NET中的MultibyteToWideChar和WideCharToMultiByte函数的替代方案是什么?_.net_Unicode_Encoding - Fatal编程技术网

.net NET中的MultibyteToWideChar和WideCharToMultiByte函数的替代方案是什么?

.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是字符串,而不是字节流。当您将二进制数据包

我正在尝试将代码从VC++迁移到.net。VC++代码使用WinAPI提供的MultiByteToWideChart和WideChart多字节函数。我尝试在.NET中使用System.Text.Encoding类,但它不适用于所有编码。是否有其他方法进行此转换?下面的代码片段有什么错误

这是我的C#代码:

MultiByteToWideChar仅适用于代码页1255,不适用于866


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-16
byte[]
数组,然后将该数组转换为代码页编码的
byte[]
数组。到目前为止还不错(尽管您可以使用
Encoding.GetBytes()
直接从UTF-16
string
转到编码的代码页
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-16
byte[]
数组,然后将该数组转换为代码页编码的
byte[]
数组。到目前为止还不错(尽管您可以使用
Encoding.GetBytes()
直接从UTF-16
string
转到编码的代码页
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++函数名来处理完全不同的东西?
编码没有问题。如果您使用正确的代码页,它可以将任何内容从一种编码转换为另一种编码。西铁