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,不会再有这种中文乱码的问题了。

 

posted on 2025-03-29 22:45  SunnyTrudeau  阅读(1244)  评论(0)    收藏  举报