.NET 编译时字符报错问题 Invalid cha racter in the given encoding

2023年7月24日 694点热度 0人点赞 0条评论
内容纲要

在 .csproj 中使用了中文,导致 Jenkins CICD 的时候报错。

Microsoft.WinFX.targets(439,8): error : Invalid character in the given encoding.

原因在于 MSBuild 或者 dotnet publish 使用的编码集合为 utf8。

file

保存 .csproj 文件时,要使用 utf-8 bom,里面的字符要使用 utf8。

而 powershell 中默认是 GB2312 编码,所以会导致报错。

另一个问题,由于需求,需要在 CICD 时,动态修改程序集名称:

        <AssemblyName>程序集名称</AssemblyName>
$content = Get-Content -Path "${env:P_NAME}.csproj" ; 
$updatedContent = $content -replace '(?<=<AssemblyName>).+?(?=</AssemblyName>)', ${env:APP_NAME} ; 
Set-Content -Path "${env:P_NAME}.csproj" -Value $updatedContent ;

但是因为在 powershell 里面,默认编码是 GB2312,所以直接替换之后,文件虽然还是 utf8,但是替换的字符是 GB2312,所以编译会报错。

网上找到的方法是使用 chcp 修改当前终端字符集编码,实际上没有任何效果。

chcp 65001 ;

实际上应该在读取写入文本时使用 -encoding utf8 ,将编码设置为 utf8。

$content = Get-Content -Path "${env:P_NAME}.csproj" -encoding  utf8; 
$updatedContent = $content -replace '(?<=<AssemblyName>).+?(?=</AssemblyName>)', ${env:APP_NAME} ; 
Set-Content -Path "${env:P_NAME}.csproj" -Value $updatedContent   -encoding  utf8;

这样,无论读取还是修改,文本传递的时候都是 utf8 编码。
file
file

痴者工良

高级程序员劝退师

文章评论