【问题标题】:Question mark not showing up in string问号未显示在字符串中
【发布时间】:2020-06-11 16:02:51
【问题描述】:

我从网站上复制了一段文字。这段文字包含一个空格。后来我尝试在 C# 中操作此字符串,但我的代码无法识别空格。 我开始深入挖掘,所以我尝试了以下 Powershell 命令将字符串转换为十六进制以查看发生了什么:

"2+1 53" | Format-Hex

(在此处查看屏幕截图:Powershell code)

从图中可以看出,结果是:

32 2B 31 3F 35 33

转换回普通文本的是

2+1?53

请注意,我的原始字符串中没有问号。到底是怎么回事?问号怎么会出现但不显示?或者如果它不在我的原始字符串中,它是从哪里来的?

更新: 也许我应该强调我需要弄清楚那个“空格”字符是什么,以便以后可以使用“替换”方法摆脱它。

【问题讨论】:

  • 您是否尝试先将复制的文本粘贴到记事本中? (删除所有编码)
  • 是的,我先复制到记事本。但这无济于事。另外,我不想删除编码。我需要了解这是什么角色。
  • 你不需要知道它是什么......使用-replace 运算符并让它用你想要的任何东西代替非数字和非运算符 - 一个标准空间,在这种情况下。我怀疑你有一个不间断的空间,而不是一个标准的空间。 [咧嘴]
  • "2+1 53" | Format-Hex -Encoding BigEndianUnicode 怎么样?

标签: string powershell encoding


【解决方案1】:

很可能,该文本中有另一个字符,不是空格。您可以通过将文本放入文件然后使用来检查它

Get-Content C:\temp\file.txt | Format-Hex

为了重现,我使用了该文本:

Get-Service –Name BITS
#           ^ it's not a normal dash, check it at http://asciivalue.com/index.php

如果我粘贴到控制台窗口会发生这种情况:

31.88 ms | C:\> "Get-Service -Name BITS" | Format-Hex


           00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F

00000000   47 65 74 2D 53 65 72 76 69 63 65 20 3F 4E 61 6D  Get-Service ?Nam
00000010   65 20 42 49 54 53                                e BITS

当我从脚本中得到它时:

60.02 ms | C:\> Get-Content C:\temp\script.ps1 | Format-Hex


           00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F

00000000   47 65 74 2D 53 65 72 76 69 63 65 20 3F 3F 3F 4E  Get-Service ???N
00000010   61 6D 65 20 42 49 54 53                          ame BITS

如您所见,该字符在从文件中获取内容时被转换为问号(十六进制输出中的3F)或三重问号(3F 3F 3F)。

【讨论】:

    【解决方案2】:

    这取决于 PowerShell 的版本。我有 5.1,Format-Hex 的默认编码是 ASCII,它将用问号替换每个非 ASCII 字符(比如你的空格)。

    指定不同的编码以防止非 ASCII 字符被替换。示例:

    PS> "⇆" | Format-Hex -Encoding Unicode
    
    
               00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
    
    00000000   C6 21                                            Æ!              
    

    这里,代码点是 U+21C6。谷歌一下,你会发现它代表什么。

    【讨论】:

    • Unicode 太落后了,哈哈。在 BigEndianUnicode 中,它以正确的方式出现。
    • Powershell 7 不允许您粘贴该字符,即使在 vscode 或 windows 终端中也是如此。但它适用于 osx。
    【解决方案3】:

    常规空格是 0x20。有许多 unicode 空间。 http://jkorpela.fi/chars/spaces.html你的绳子是怎么做的?这是 EN SPACE(螺母)的示例,U+2002。您应该可以自己复制和粘贴。嗯,在windows的powershell 7中,特殊空间不会粘贴。

    [int[]][char[]]'foo bar' | % tostring x
    
    66
    6f
    6f
    2002
    62
    61
    72
    
    
    'foo bar' | Format-Hex -Encoding BigEndianUnicode
    
    
               00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
    
    00000000   00 66 00 6F 00 6F 20 02 00 62 00 61 00 72        .f.o.o ..b.a.r
    

    在 powershell 5 中,Format-h​​ex 将默认将其转换为 ascii。Unicode 字符将被 3F 或 ? 替换。

    'foo bar' | format-hex -Encoding ascii               
    
    
    Label: String (System.String) <72F012A4>
    
           Offset Bytes                                           Ascii
                  00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
           ------ ----------------------------------------------- -----
    0000000000000 66 6F 6F 3F 62 61 72                            foo?bar
    

    UTF8 将编码一到三个字节,具体取决于 unicode 数字有多高(要编码多少位)。本例中为三个字节 (U+2002),始终以“E”开头,然后是第一个数字,在本例中为“2”。

    ' ' | format-hex -Encoding utf8           
    # "`u{2002}" | format-hex # powershell 7
    
    Label: String (System.String) <03ACFE1C>
    
           Offset Bytes                                           Ascii
                  00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
           ------ ----------------------------------------------- -----
    0000000000000 E2 80 82                                        �
    

    【讨论】:

      【解决方案4】:

      我在这里找到了我的问题的答案:String Comparison, .NET and non breaking space

      字符串中的“空格”是“不间断空格”,在 C# 中删除它很简单:

      string cellText = "String with non breaking spaces.";
      cellText = Regex.Replace(cellText, @"\u00A0", " ");
      

      【讨论】:

        猜你喜欢
        • 2016-07-02
        • 2019-05-15
        • 2017-04-23
        • 1970-01-01
        • 2021-11-07
        • 1970-01-01
        • 2013-12-24
        • 1970-01-01
        • 2015-07-16
        相关资源
        最近更新 更多