Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用powershell进行编码_Powershell_Encoding_Utf 8_Special Characters - Fatal编程技术网

使用powershell进行编码

使用powershell进行编码,powershell,encoding,utf-8,special-characters,Powershell,Encoding,Utf 8,Special Characters,我有以下问题:假设我有一个UTF8文件,其中每个特殊字符都用替换字符表示“�". 文件的某些部分可能如下所示: 达斯希尔酒店�ckg�我是祖马辰 R�ckg�ngig:这是geamcht吗 韦特尔W�这是一个很好的例子 海尔诺奇酒店�麦汁 zwei在einer Zeile G�高温和高温��e 我编写了一个PowerShell脚本,它将替换的_字符替换为相应的特殊字符,例如“a”、“u”或“ß”。更正后的文本(也是UTF8)如下所示: 这是我的梦想 吕克格:这是个好消息吗 韦特尔·沃特·吉布斯·

我有以下问题:假设我有一个UTF8文件,其中每个特殊字符都用替换字符表示“�". 文件的某些部分可能如下所示:

达斯希尔酒店�ckg�我是祖马辰 R�ckg�ngig:这是geamcht吗 韦特尔W�这是一个很好的例子 海尔诺奇酒店�麦汁 zwei在einer Zeile G�高温和高温��e

我编写了一个PowerShell脚本,它将替换的_字符替换为相应的特殊字符,例如“a”、“u”或“ß”。更正后的文本(也是UTF8)如下所示:

这是我的梦想 吕克格:这是个好消息吗 韦特尔·沃特·吉布斯·祖科里吉伦 我不喜欢麦汁 zwei在einer Zeile Göhte和Grö223;e

问题是,我想要导入文本的程序只接受“WesterEuropean DOS(CP850)”编码的文件。顺便说一下,这是程序导出的原始编码,如果我没有打开文件、编辑并将其保存在UTF8中,导入时不会出现问题。 下面是发生的事情:

  • 我将特定程序中的文件导出为“WesterEuropean DOS(CP850)”。[注意:每个特殊字符在这里都有自己的替换字符,因此导入将很容易,并恢复特殊字符]

  • 我用自己选择的编辑器打开文件,编辑器自己检测到“UTF8”不正确。我无法识别、编辑文件并将其保存为UTF8。[现在每个特殊字符都有相同的替换字符,其�]

  • 我意识到有什么地方出了问题,于是写了一个脚本,替换了每一次发生的错误� 通过UTF8中的正确特殊字符。[我认为脚本如何实现这一点并不重要,但如果是这样,请询问]

  • 我有正确的UTF8文件,但正如您所记得的,我必须将“Wester European DOS(CP850)”导入到我的程序中。文件编码与导出文件的编码相同。这种编码确保每个特殊字符都有其唯一的替换字符。那么,我如何通过PowerShell返回到该文件

  • 下面是一些详细信息。脚本在我要更正的文件中读取的行是:

    $lines = get-content $file -encoding utf8 | select-string $SearchCharacter
    
    该算法在每一行中运行,并要求使用该字符的任何错误单词进行更正,如果再次找到该字符,则跳过该字符。在找到所有文件中的所有更正后,它将在循环中用此行替换每个文件中从每个“键”(错误单词)到每个“值”(更正单词)的出现:

    foreach key ...
    (Get-Content -encoding utf8 $file) -replace "$key", "$value" | Set-Content -encoding utf8 $file
    
    我已经尝试过这样做:

    foreach key ...
    (Get-Content -encoding utf8 $file) -replace "$key", "$value" | Set-Content -encoding OEM $file
    
    但这会导致使用“?”而不是正确的字符:

    这是我的工作 r?ckg?ngig:这是一个好消息吗 韦特尔·沃特·吉布特·祖科里吉耶伦 我不喝麦汁 zwei在一个巨大的世界里

    对如何从UTF8构建“西欧DOS(CP850)”文件有何建议

    编辑:

    此函数源自,解决了我的问题:

    Function ConvertAndReplace_UTF8_OEM850
    {
    Param ([String]$path)
    $path = resolve-path $path
    $sourceEncoding = [System.Text.Encoding]::GetEncoding(65001)
    $targetEncoding = [System.Text.Encoding]::GetEncoding(850)
    $textfile = [System.IO.File]::ReadAllText($path, $sourceencoding)
    [System.IO.File]::WriteAllText($path, $textfile, $targetencoding)
    Write-host "Content in $path converted from UTF-8 to OEM850"
    }
    

    假设您已经修复了UTF-8编码文件(因此它包含原始字符),您只需将UTF-8文件重新编码回代码页
    850
    (CP850)

    如果系统的活动OEM代码页为
    850
    (使用
    chcp
    验证):

    注意:
    (获取内容-编码utf8$文件)|设置内容-编码OEM$文件
    也可以,但可能会改变所使用的换行符序列,并且始终附加一个尾随换行符,即使原始文件没有。但是,在Windows PowerShell v4及以下版本中,此变体可能仍然是更好的选择,因为不支持
    -NoNewline

    如果它不是或不能假定为:

    在PowerShell[Core]6+
    中,
    设置内容
    -编码
    参数现在接受代码页码:

    Set-Content -NoNewline -Encoding 850 $file -Value (Get-Content -Raw -Encoding utf8 $file)
    
    Windows PowerShell(PowerShell版本在v5.1之前)中,需要直接使用.NET Framework:

    [IO.File]::WriteAllText(
      (Convert-Path $file),
      (Get-Content -Raw -Encoding utf8 $file),
      [Text.Encoding]::GetEncoding(850)
    )
    
    请注意,使用
    Convert Path
    可确保将
    $file
    解析为完整路径,这是必要的,因为.NET的工作目录通常与PowerShell的不同


    Windows PowerShell中,
    -Encoding
    参数所接受的值仅限于一个固定集,该固定集仅包含活动的ANSI(
    默认值)和OEM(
    OEM
    )代码页
    ,基于系统的旧系统语言环境(非Unicode程序的语言)

    PowerShell[Core]6+中,您可以通过数字甚至直接传递实例

    相反,即使
    OEM
    仍然可以用于引用活动的OEM代码页,但从v7.0开始活动的ANSI代码页没有占位符-中已报告此遗漏。

    如果您错误地读取CP850文件并将其保存为UTF-8,则信息丢失:所有非ASCII字符都已替换为h完全相同的字符,
    (替换字符,)@mklement0这正是我所描述的。我已经修复了utf8文件。我如何回到CP850?可能的编码参数不适合我的问题。我必须回到OEM850。所以我找到了这个网站:而不是那个:我已经发布了在我的问题中起作用的函数。你知道为什么编码参数不够吗参数,比如OEM850?我想了解一下。
    
    [IO.File]::WriteAllText(
      (Convert-Path $file),
      (Get-Content -Raw -Encoding utf8 $file),
      [Text.Encoding]::GetEncoding(850)
    )