【问题标题】:SVN output encoding in PowerShellPowerShell 中的 SVN 输出编码
【发布时间】:2012-06-07 12:40:34
【问题描述】:

我正在尝试在 PowerShell 脚本内的字符串中捕获 SVN 日志。

在命令行上,输出的编码是正确的,但是一旦我将它捕获到一个字符串中,它就不是了:

PS C:\sandbox> svn log -r1804 https://myserver.here/svn/myrepo
--------------------------------------------------------------
r1804 | myname | 2012-06-07 | 1 line
Here is my log message with a special caractère
--------------------------------------------------------------
PS C:\sandbox> $tempStr = svn log -r1804 https://myserver.here/svn/myrepo | Out-String
PS C:\sandbox> $tempStr
--------------------------------------------------------------
r1804 | myname | 2012-06-07 | 1 line
Here is my log message with a special caractére
--------------------------------------------------------------

如果有帮助,这里是我系统上 $OutputEncoding 的值:

IsSingleByte      : True
BodyName          : us-ascii
EncodingName      : US-ASCII
HeaderName        : us-ascii
WebName           : us-ascii
WindowsCodePage   : 1252
IsBrowserDisplay  : False
IsBrowserSave     : False
IsMailNewsDisplay : True
IsMailNewsSave    : True
EncoderFallback   : System.Text.EncoderReplacementFallback
DecoderFallback   : System.Text.DecoderReplacementFallback
IsReadOnly        : True
CodePage          : 20127

谢谢!!

编辑:

我也尝试过 SVN 的 XML 输出如下,但没有运气!

$CmdLine = "svn log -r40:HEAD https://myserver.here/svn/myrepo --xml";

$Logs = [xml](Invoke-Expression $CmdLine);

foreach ($Commit in $Logs.log.logentry)
{
   Write-Host $Commit.msg;
}

编辑 #2:

我不知道它是否有帮助,但我注意到在 PowerShell 控制台提示符下直接使用 XML 输出格式存在同样的问题:

PS C:\repo> svn log -r999:999
------------------------------------------------------------------------
r999 | myname | 2013-05-29 09:48:20 +0200 (mer., 29 mai 2013) | 2 lines

Log message line #1 with a special 'caractère'
Log message line #2
------------------------------------------------------------------------

PS C:\repo> svn log -r999:999 --xml
<?xml version="1.0" encoding="UTF-8"?>
<log>
<logentry
   revision="999">
<author>myname</author>
<date>2013-05-29T07:48:20.915930Z</date>
<msg>Log message line #1 with a special 'caractére'
Log message line #2</msg>
</logentry>
</log>

【问题讨论】:

  • 没有管道输出字符串的相同行为?
  • 是的,一模一样:(

标签: svn powershell character-encoding


【解决方案1】:

试着这样说:

$OutputEncoding = [Console]::OutputEncoding

在您调用 svn 之前。

【讨论】:

  • 我测试了这个$OutputEncoding = [Console]::OutputEncoding $ChangeLog = Invoke-Expression $CmdLine | Out-String 其中$CmdLine 是我的svn 命令。不幸的是还是同样的问题...
  • 您在 PC 上使用什么语言环境?会猜法国的,不是吗?
  • @YannickBlondeau 尝试使用$OutputEncoding = [System.Text.Encoding]::Unicode 或 [System.Text.Encoding]::UTF8
  • @David 是的,没错。这会是个问题吗?
【解决方案2】:

它不是直接对 powershell 友好,但SharpSvn 直接将 Subversion api 提供给 .Net,因此您根本不需要任何解析。

如果您使用 'svn log',我建议使用 --xml 以避免应对未来的输出变化。

svn 的输出是 UTF-8,它作为 Unicode 传输到 Windows,所以我建议阅读为 Unicode。

【讨论】:

    【解决方案3】:

    这篇博文Powershell, SVN Log, and Encodings 解释并解决了与 Powershell 中的 SVN 编码非常相似的问题。它对我有用。

    【讨论】:

    • 感谢您的指点,但不幸的是,这并不能解决我的问题:(
    【解决方案4】:

    我很幸运:

    $enc = [System.Text.Encoding]::GetEncoding($Host.CurrentCulture.TextInfo.OEMCodePage)
    $output = $enc.GetBytes((svn log --xml))
    [xml] $result = [System.Text.Encoding]::UTF8.GetString($output)
    

    【讨论】:

      猜你喜欢
      • 2018-07-08
      • 1970-01-01
      • 2012-02-25
      • 2017-02-27
      • 1970-01-01
      • 1970-01-01
      • 2014-09-16
      • 1970-01-01
      相关资源
      最近更新 更多