C#编码转换为UTF-8-Windows 7与Windows Server 2008 R2上的不同行为?

C#编码转换为UTF-8-Windows 7与Windows Server 2008 R2上的不同行为?,c#,windows-7,encoding,utf-8,windows-server-2008-r2,C#,Windows 7,Encoding,Utf 8,Windows Server 2008 R2,当涉及到UTF-8的编码转换时,我在Windows平台之间遇到了一些奇怪的行为。如果我有一个包含“扩展ASCII”字符的字符串,比如商标符号的类似字符0x99,我可以在Windows 7上使用以下代码对其进行转换: using System.Text; ... string DefaultEncodedStr = <<Some string with Extended ASCII chars like 0x99 for TM>> byte[] DefaultEncoded

当涉及到UTF-8的编码转换时,我在Windows平台之间遇到了一些奇怪的行为。如果我有一个包含“扩展ASCII”字符的字符串,比如商标符号的类似字符0x99,我可以在Windows 7上使用以下代码对其进行转换:

using System.Text;
...
string DefaultEncodedStr = <<Some string with Extended ASCII chars like 0x99 for TM>>
byte[] DefaultEncodedBytes = Encoding.Default.GetBytes(DefaultEncodedStr);
byte[] UTF8EncodedBytes = Encoding.Convert(Encoding.Default, Encoding.UTF8, DefaultEncodedBytes);
char[] UTF8Chars = new char[Encoding.UTF8.GetCharCount(UTF8EncodedBytes, 0, UTF8EncodedBytes.Length)];
UTF8.GetChars(UTF8EncodedBytes, 0, UTF8EncodedBytes.Length, UTF8Chars, 0);
string UTF8Str = new string(UTF8Chars); 
使用System.Text;
...
字符串DefaultEncoderDSTR=
字节[]DefaultEncodedBytes=Encoding.Default.GetBytes(DefaultEncodedStr);
byte[]UTF8EncodedBytes=Encoding.Convert(Encoding.Default,Encoding.UTF8,DefaultEncodedBytes);
char[]UTF8Chars=new char[Encoding.UTF8.GetCharCount(UTF8EncodedBytes,0,UTF8EncodedBytes.Length)];
GetChars(UTF8EncodedBytes,0,UTF8EncodedBytes.Length,UTF8Chars,0);
字符串UTF8Str=新字符串(UTF8Chars);
但是,此代码无法转换Windows Server 2008 R2上的初始字符串——最终字符串中仍然存在“扩展ASCII”字符

但是,此代码在Windows Server 2008 R2上不起作用:

using System.Text;
...
string DefaultEncodedStr = <<Some string with Extended ASCII chars like 0x99 for TM>>
byte[] DefaultEncodedBytes = Encoding.Default.GetBytes(DefaultEncodedStr)
string UTF8Str = Encoding.UTF8.GetString(DefaultEncodedBytes); 
使用System.Text;
...
字符串DefaultEncoderDSTR=
字节[]DefaultEncodedBytes=Encoding.Default.GetBytes(DefaultEncodedStr)
字符串UTF8Str=Encoding.UTF8.GetString(DefaultEncodedBytes);
但是,此代码无法在Windows 7上转换字符串


有什么好处?为什么我看到桌面类和使用相同内核库(Win7)的服务器类操作系统的行为不同?我真的需要包含某种平台检测代码来确定如何正确处理编码转换吗???

.NET字符串是Unicode字符序列。如果你有一根绳子

string s = "™";
然后字符串由Unicode U+2122商标符号字符组成

所以,你可以写

string s = "\u2122";
可以使用编码将此字符序列转换为字节序列

一种编码是UTF-8:

byte[] bytes = Encoding.UTF8.GetBytes(s);
// bytes == { 0xE2, 0x84, 0xA2 }
另一种编码是Windows-1252:

byte[] bytes = Encoding.GetEncoding("Windows-1252").GetBytes(s);
// bytes == { 0x99 }
因此,如果在Windows-1252中有一个表示字符串的字节序列,该序列由字节0x99组成,则可以将其解码为字符串,如下所示:

string result = Encoding.GetEncoding("Windows-1252").GetString(bytes);
// result == "™"
返回操作系统的默认编码。这可能是Windows-1252,但不一定是。始终指定要显式使用的编码

不同的计算机可以使用不同的编码作为默认编码,默认编码甚至可以在一台计算机上更改。因此,从一台计算机到另一台计算机的数据流,甚至在同一台计算机上的不同时间检索到的数据可能会被错误地转换

另见:


它是如何失败的?结果是否不正确,或者是否出现异常?如果是前者,你期待什么?如果是后者,会出现什么样的异常?如果您提供一个示例问题字符串,这样人们就可以复制粘贴进行测试,这会很有帮助。在安装了不同语言包的机器上是否存在任何差异?您想做什么?您没有转换编码-字符串就是字符串。没有UTF-8字符串或ASCII字符串。字符串没有编码语义。因为
编码。默认值
是操作系统当前ANSI代码页的编码。
两台不同配置的机器可能有问题,否?这是错误的。我还想提到的是,没有X字符,X是编码或字符集。字符不完全属于字符集。™ 例如,包含在20多个不同的字符集中。好的,这很有意义。我最初得到的字符串显然已“硬编码”到Windows-1252,但基本操作系统不知道这一点,只是使用Encoding.Default,因此我必须指示系统假定Windows-1252为初始字符串。谢谢字符串没有编码!!只有表示字符串的字节序列才可以。