VS2022使用特定编码保存文件为utf8解决中文乱码
VS2022使用特定编码保存文件为utf8解决中文乱码
VS2022有一个菜单:工具-选项-文档,使用特定编码保存文件,通过把文件默认编码设置为uft8,可以解决部分情况下中文乱码问题。
问题现象
使用VS2022新建一个WorkerService类型的项目WorkerService20250328,添加docker支持,使用默认的模板代码,在Worker文件每秒输出日志的地方,增加一行中文日志。此时用记事本打开Worker.cs,可以看到文件编码是ANSY。
public class Worker : BackgroundService { private readonly ILogger<Worker> _logger; public Worker(ILogger<Worker> logger) { _logger = logger; } protected override async Task ExecuteAsync(CancellationToken stoppingToken) { while (!stoppingToken.IsCancellationRequested) { if (_logger.IsEnabled(LogLevel.Information)) { _logger.LogInformation("Worker running at: {time}", DateTimeOffset.Now); _logger.LogInformation("后台服务运行时间 : {time}", DateTimeOffset.Now); } await Task.Delay(1000, stoppingToken); } } }
在Windows系统本机调试运行这个项目,是可以输出中文日志的。
把WorkerService20250328项目文件拖到linux云服务器,docker build创建镜像。
注意,模板默认创建的Dockerfile复制WorkerService20250328/WorkerService20250328.csproj到容器中编译,要把Dockerfile复制到WorkerService20250328.csproj上层目录,再创建镜像。
# 请参阅 https://aka.ms/customizecontainer 以了解如何自定义调试容器,以及 Visual Studio 如何使用此 Dockerfile 生成映像以更快地进行调试。 # 此阶段用于在快速模式(默认为调试配置)下从 VS 运行时 FROM mcr.microsoft.com/dotnet/runtime:8.0 AS base USER $APP_UID WORKDIR /app # 此阶段用于生成服务项目 FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build ARG BUILD_CONFIGURATION=Release WORKDIR /src COPY ["WorkerService20250328/WorkerService20250328.csproj", "WorkerService20250328/"] RUN dotnet restore "./WorkerService20250328/WorkerService20250328.csproj" COPY . . WORKDIR "/src/WorkerService20250328" RUN dotnet build "./WorkerService20250328.csproj" -c $BUILD_CONFIGURATION -o /app/build # 此阶段用于发布要复制到最终阶段的服务项目 FROM build AS publish ARG BUILD_CONFIGURATION=Release RUN dotnet publish "./WorkerService20250328.csproj" -c $BUILD_CONFIGURATION -o /app/publish /p:UseAppHost=false # 此阶段在生产中使用,或在常规模式下从 VS 运行时使用(在不使用调试配置时为默认值) FROM base AS final WORKDIR /app COPY --from=publish /app/publish . ENTRYPOINT ["dotnet", "WorkerService20250328.dll"]
假如删减为COPY ["WorkerService20250328.csproj", "WorkerService20250328/"],然后在WorkerService20250328.csproj同级目录docker build创建镜像,会提示一个奇怪的错误,没有Main函数。网上有介绍这个问题的解决方案,参考https://cloud.tencent.com/developer/ask/sof/106829994
> [build 7/7] RUN dotnet build "./WorkerService20250328.csproj" -c Release -o /app/build:
1.154 Determining projects to restore...
1.685 All projects are up-to-date for restore.
3.979 CSC : error CS5001: Program does not contain a static 'Main' method suitable for an entry point [/src/WorkerService20250328/WorkerService20250328.csproj]
在WorkerService20250328.csproj上层目录创建镜像是没问题的。
[root@iZbp1av9q87ufz479k2cqiZ home]# docker build -t myimage:latest .
运行容器,中文是乱码
[root@iZbp1av9q87ufz479k2cqiZ home]# docker run myimage -t
info: WorkerService20250328.Worker[0]
Worker running at: 03/29/2025 13:53:58 +00:00
info: WorkerService20250328.Worker[0]
��̨��������ʱ��: 03/29/2025 13:53:58 +00:00
info: Microsoft.Hosting.Lifetime[0]
Application started. Press Ctrl+C to shut down.
info: Microsoft.Hosting.Lifetime[0]
Hosting environment: Production
info: Microsoft.Hosting.Lifetime[0]
Content root path: /app
info: WorkerService20250328.Worker[0]
Worker running at: 03/29/2025 13:53:59 +00:00
info: WorkerService20250328.Worker[0]
��̨��������ʱ��: 03/29/2025 13:53:59 +00:00
info: WorkerService20250328.Worker[0]
Worker running at: 03/29/2025 13:54:00 +00:00
info: WorkerService20250328.Worker[0]
��̨��������ʱ��: 03/29/2025 13:54:00 +00:00
问题解决
VS2022打开工具-选项-文档,打钩使用特定编码保存文件,UTF-8无签名

给Worker文件的中文日志增加一个空格,保存文件,此时用记事本打开Worker.cs,可以看到文件编码已经是UFT-8。
再把源代码文件上传到linux服务器,删除旧的容器和镜像,创建新的镜像,运行容器,可以看到能够显示中文日志了。
[root@iZbp1av9q87ufz479k2cqiZ home]# docker run myimage -t
info: WorkerService20250328.Worker[0]
Worker running at: 03/29/2025 13:59:20 +00:00
info: WorkerService20250328.Worker[0]
后台服务运行时间 : 03/29/2025 13:59:20 +00:00
info: Microsoft.Hosting.Lifetime[0]
Application started. Press Ctrl+C to shut down.
info: Microsoft.Hosting.Lifetime[0]
Hosting environment: Production
info: Microsoft.Hosting.Lifetime[0]
Content root path: /app
info: WorkerService20250328.Worker[0]
Worker running at: 03/29/2025 13:59:21 +00:00
info: WorkerService20250328.Worker[0]
后台服务运行时间 : 03/29/2025 13:59:21 +00:00
info: WorkerService20250328.Worker[0]
Worker running at: 03/29/2025 13:59:22 +00:00
info: WorkerService20250328.Worker[0]
后台服务运行时间 : 03/29/2025 13:59:22 +00:00
后续用VS2022创建项目,所有文件编码都是uft8,不会再有这种中文乱码的问题了。
浙公网安备 33010602011771号