使用powershell进行编码
我有以下问题:假设我有一个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中,导入时不会出现问题。 下面是发生的事情:使用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)如下所示: 这是我的梦想 吕克格:这是个好消息吗 韦特尔·沃特·吉布斯·
$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)
)