C#调用PowerShell指令得到的返回值中,有时会出现无法显示的字符,比如:

Get-Tpm指令,返回:

TpmPresent                : True
TpmReady                  : True
TpmEnabled                : True
TpmActivated              : True
TpmOwned                  : True
RestartPending            : True
ManufacturerId            : 1229870147
ManufacturerIdTxt         : INTC
ManufacturerVersion       : 403.1.0.0???????????????????????
ManufacturerVersionFull20 : 403.1.0.0???????????????????????????????????????????????????????????????????????????????????
                            ????????
ManagedAuthLevel          : Full
OwnerAuth                 : 
OwnerClearDisabled        : False
AutoProvisioning          : Enabled
LockedOut                 : False
LockoutHealTime           : 10 minutes
LockoutCount              : 0
LockoutMax                : 31
SelfTest                  : {}

长串的问号就是无法显示的字符。

这会导致在WinForm界面上显示不全。比如把这段内容显示在RichTextBox上,前面部分正常,遇到奇怪字符就停止显示了。

C# WinForm 字符串中包含 NUL导致显示不全_开发语言

把字符串转成byte数组打印出来,发现奇怪的byte是0.

byte[] bytes = Encoding.Default.GetBytes(s);
foreach (byte b in bytes)
{
   Console.Write(b.ToString("X") + " ");            
}

C# WinForm 字符串中包含 NUL导致显示不全_后端_02

 查了一下ASCII表,发现0x00是NUL:

C# WinForm 字符串中包含 NUL导致显示不全_开发语言_03

 尝试在byte数组中把0x00换成其他的,比如01,02,08,字符串都可以正常显示:

C# WinForm 字符串中包含 NUL导致显示不全_后端_04

C# WinForm 字符串中包含 NUL导致显示不全_显示不全_05 

 目前的结论就是只要把0x00拿掉就能解决这个字符串显示不全的问题。

List<byte> newBytes = new List<byte>();
byte[] bytes = Encoding.Default.GetBytes(s);
foreach (byte b in bytes)
{
    if (b == 0x00) { continue; }
     newBytes.Add(b);
}
            
return Encoding.Default.GetString(newBytes.ToArray());

 全部正常显示了:

C# WinForm 字符串中包含 NUL导致显示不全_开发语言_06

问题解决。