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

Iri*_*can 2 c# encoding utf-8 windows-7 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[] 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); 
Run Code Online (Sandbox Code Playgroud)

但是,此代码无法转换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); 
Run Code Online (Sandbox Code Playgroud)

但是,此代码无法转换Windows 7上的字符串!

是什么赋予了?为什么我在Desktop类和使用相同内核库(Win7)的Server类操作系统之间看到不同的行为?我是否真的需要包含某种平台检测代码来确定如何正确处理编码转换?

dtb*_*dtb 6

.NET字符串是Unicode字符的序列.如果你有一个字符串

string s = "™";
Run Code Online (Sandbox Code Playgroud)

然后该字符串由Unicode U + 2122 TRADE MARK SIGN字符组成.

所以,相当于你可以写

string s = "\u2122";
Run Code Online (Sandbox Code Playgroud)

您可以使用编码将此字符序列转换为字节序列.

一种编码是UTF-8:

byte[] bytes = Encoding.UTF8.GetBytes(s);
// bytes == { 0xE2, 0x84, 0xA2 }
Run Code Online (Sandbox Code Playgroud)

另一种编码是Windows-1252:

byte[] bytes = Encoding.GetEncoding("Windows-1252").GetBytes(s);
// bytes == { 0x99 }
Run Code Online (Sandbox Code Playgroud)

因此,如果您有一个字节序列表示Windows-1252中的字符串并且包含字节0x99,则可以将其解码为字符串,如下所示:

string result = Encoding.GetEncoding("Windows-1252").GetString(bytes);
// result == "™"
Run Code Online (Sandbox Code Playgroud)

Encoding.Default返回操作系统的默认编码.这可能是Windows-1252,但不是必须的.始终指定要显式使用的编码.

不同的计算机可以使用不同的编码作为默认编码,默认编码甚至可以在单台计算机上更改.因此,从一台计算机流式传输到另一台计算机或甚至在同一台计算机上不同时间检索的数据可能会被错误地翻译.

也可以看看: