当从powershell调用时,Iconv将转换为UTF-16而不是UTF-8

4
我在尝试使用PowerShell脚本中的iconv批量将一些文件的编码从ISO-8859-1转换为UTF-8时遇到了问题。
我有一个批处理文件,它可以正常工作:
for %%f in (*.txt) do (
  echo %%f
  C:\"Program Files"\GnuWin32\bin\iconv.exe -f iso-8859-1 -t utf-8 %%f > %%f.UTF_8_MSDOS 
)

我需要将目录结构中的所有文件转换,因此我编写了另一个脚本,这次使用powershell:

Get-ChildItem -Recurse -Include *.java |
  ForEach-Object {
    $inFileName = $_.DirectoryName + '\' + $_.name
    $outFileName = $inFileName + "_UTF_8"
    Write-Host Convirtiendo $inFileName -> $outFileName  
    C:\"Program Files"\GnuWin32\bin\iconv.exe -f iso-8859-1 -t utf-8 $inFileName > $outFileName
  }

使用这种方法,结果是将文件转换为UTF-16编码。我不知道自己做错了什么。

有人能帮我吗?这可能是PowerShell本身的编码问题吗?

我正在使用W7和WXP以及LibIconv 1.9.2。

1个回答

5

> 实际上是使用 Out-File 命令,其默认编码为 Unicode。请尝试:

iconv.exe ... | Out-File -Encoding Utf8

或者带参数:
& "C:\Program Files\GnuWin32\bin\iconv.exe" -f iso-8859-1 -t utf-8 $inFileName |
   Out-File -Encoding Utf8 $outFileName 

由于iconv.exe输出为UTF8格式,您需要告诉.NET控制台子系统如何解释stdin流(在执行iconv.exe之前执行以下命令):

[Console]::OutputEncoding = [Text.Encoding]::UTF8 

谢谢你的回复,Keith。 我刚刚尝试了一下。现在输出文件是UTF-8编码,但是一些字符(例如ñ和á)已经损坏了。在iconv输出中它们是正确的(至少当我使用我的BAT版本时我看到它们是好的)。有什么想法吗? - fdediego
1
你需要告诉PowerShell iconv.exe正在使用哪种编码。设置控制台输出编码,以便PowerShell知道如何解释从iconv.exe输出的字节 - [Console] :: OutputEncoding = [Text.Encoding] :: UTF8 - 如此讨论在这里http://keithhill.spaces.live.com/blog/cns!5A8D2641E0963A97!7212.entry - Keith Hill

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接