【问题标题】:Removing unicode character using Powershell使用 Powershell 删除 unicode 字符
【发布时间】:2021-09-20 08:44:47
【问题描述】:

我在 Excel 中使用 vlookup 时遇到了一些问题。 我已经看到了这个问题,但我没有得到解决方案是的。

我在一个 txt 文件中有大量行,这些行包含 Unicode 字符。

示例: 这一行:'S0841488.JPG06082014‏‎08.21' 包含这两个 unicode 字符: U+200F U+200E 'S0841488.JPG06082014 U+200F U+200E 08.21.

请告诉我如何使用 Powershell 删除这些 un​​icode 字符。

【问题讨论】:

    标签: powershell unicode


    【解决方案1】:

    如果它们如您所说的那样写为“U+200F”和“U+200E”,那么基本替换就可以了。只需要在 + 之前制作转义字符。因为它在正则表达式中有特殊的含义。

    正则表达式解释:

    \s - 表示空格。

    ? - 它可能存在,也可能不存在。

    \ - 在 + 之前是一个转义字符。

    [EF] - 表示字母E或字母F。

    ('|.$) - 单引号或点结尾。

    # Path to your file and new file where no unicode characters.
    $Path = "C:\JustForExample\FileThatContainsThisLines.txt"
    $NewPath = "C:\JustForExample\FileThatContainsThisLines2.txt"
    
    # Getting content of file.
    $content = Get-Content -Path $Path
    
    # Removing unicode characters.
    $newContent = $content -replace "\s?U\+200[EF]\s?"
    
    # For removing quot and dot at the end.
    $newContent = $newContent -replace "('|\.$)" 
    
    # Saving content to new Path.
    # If you need to replace them inside the file, so just change NewPath to Path.
    $newContent | Set-Content -Path $NewPath
    

    所以替换简单应该删除与该模式匹配的内容。

    【讨论】:

    • 嗨 Puzo 谢谢 - 但是 - 对不起,它没有按预期工作。我使用这个 URL 来查看 Unicode 字符:soscisurvey.de/tools/view-chars.php - 运行脚本后,字符并没有被删除。结果是:S0841488.JPG06082014‏‎ U+200F U+200E 08.21.
    • 嗯...我的主要问题是因为我无法重现它以检查为什么它不起作用。也许您可以尝试将所有内容转换为 UTF8,然后它们变得可见。 $MyRawString = Get-Content -Raw $Path $Utf8NoBomEncoding = New-Object System.Text.UTF8Encoding $False [System.IO.File]::WriteAllLines($NewPath, $MyRawString, $Utf8NoBomEncoding) 你能分享一些示例文件吗?
    • 希望从字符串中删除实际的 Unicode 字符 - 像 U+200F 这样的东西只是这些字符的可视化,它们本身是不可见的我>。如果您从问题中复制并粘贴短语“This line:”后面的字符串,您将得到一个包含这些隐藏字符的字符串。
    • 使用此命令删除所有超出 ASCII 范围的字符:$newContent = $content -replace '\P{IsBasicLatin}' 虽然,它会创建一个新错误:ALL 'I'(大写 i ) 被删除。
    • 在元注释上,@Larry:除非您@-提及我(就像我刚刚对您的用户名所做的那样),否则我不会收到后续 cmets 的通知。如果您对 my 答案发表评论(这会更好,并且应该在此处发布任何后续 cmets),您就不需要 @-mentioning。
    【解决方案2】:

    如果您想删除所有超出 ASCII 范围的字符(Unicode 代码点范围 U+0000 - U+007F):

    PowerShell (Core) 7+解决方案:

    # Removes any non-ASCII characters from the LHS string,
    # which includes the problematic hidden control characters.
    'S0841488.JPG06082014‏‎08.21' -replace '\P{IsBasicLatin}'
    

    该解决方案使用基于正则表达式的-replace operator,以及Unicode block nameIsBasicLatin 的否定形式(\P),它指的是Unicode 的ASCII 子范围。简而言之:\P{IsBasicLatin} 匹配任何非 ASCII 字符,并且由于没有指定替换字符串,因此有效地删除它;结合-replace 总是替换输入字符串中的 all 匹配项,所有非 ASCII 字符都将被删除。

    Windows PowerShell解决方案:

    令人难以置信的是,Windows PowerShell 中的一个错误(从 v5.1.19041.1023 开始;v5.1.x 是最新的最终版本)源自底层 .NET Framework 4.8.4390.0, 错误地认为 ASCII 范围 i / I 超出了 ASCII 范围,因此将其删除; 解决方法

    # WORKAROUND for Windows PowerShell to prevent removal of 'I' / 'i'
    'Ii-S0841488.JPG06082014‏‎08.21' -replace '[^i\p{IsBasicLatin}]'
    

    您可以验证这有效地从您的字符串中删除(不可见的)从左到右标记U+200E 和从右到左标记U+200F 字符Debug-String 函数,可用作an MIT-licensed Gist:

    # Download and define the Debug-String function.
    # NOTE: 
    #  I can personally assure you that doing this is safe, but you
    #  you should always check the source code first.
    irm https://gist.github.com/mklement0/7f2f1e13ac9c2afaf0a0906d08b392d1/raw/Debug-String.ps1 | iex
    
    
    # Visualize the existing non-ASCII-range characters
    'S0841488.JPG06082014‏‎08.21' | Debug-String -UnicodeEscapes
    
    # Remove them and verify that they're gone.
    'S0841488.JPG06082014‏‎08.21' -replace '\P{IsBasicLatin}' | Debug-String -UnicodeEscapes
    

    以上结果如下:

    S0841488.JPG06082014`u{200f}`u{200e}08.21
    S0841488.JPG0608201408.21
    

    注意原始输入字符串中不可见的控制字符`u{200f}`u{200e} 的可视化,以及应用-replace 操作后它们如何不再存在。

    在 PowerShell (Core) 7+(但不是 Windows PowerShell)中,此类 Unicode 转义序列也可用于可扩展字符串,即在双引号字符串文字中(例如,"Hi`u{21}" 逐字扩展为 Hi!)-请参阅概念性的 about_Special_Characters 帮助主题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-08
      • 2015-04-23
      • 1970-01-01
      • 1970-01-01
      • 2016-12-19
      相关资源
      最近更新 更多