问题描述
最近有一个DotNetWebApi服务需要使用Docker在服务器部署,部署后部分接口返回内容会出现部分乱码的情况。
一些关键点:
- 服务本机直接启动,此接口无异常;
- 服务器直接启动,此接口无异常
- 服务器为Ubuntu20.04
- 安装了DotNet运行时
- 启动方式为dotnet run
- 打包镜像后在服务器启动容器出现上述异常;
- 其它接口中文返回正常
- 出现异常的接口返回体中,仅部分字段内容为中文时异常,有些字段中文显示正常
- 异常字段通过Description注解获取其中文描述值
问题原因
使用VSCode打开出现问题的枚举类的CS文件,查看编码!文件编码为“GB2312”!其它正常文件编码为UTF8(with bom)!
改变此枚举类文件为UTF8(with bom)重新部署即可解决问题!
关于代码文件编码为GB2312时反射获取值乱码的一些疑问
- 为什么Description特性属性值获取到乱码?
- 为什么本机部署以及在服务器直接启动却没有问题?
获取枚举字段描述特性属性值的方法
/// <summary>
/// Get the description of the "Description" attribute on enum object.
/// </summary>
/// <param name="enum"></param>
/// <returns></returns>
public static string GetDescription(this Enum @enum)
{
var field = @enum.GetType().GetField(@enum.ToString());
var customAttribute = Attribute.GetCustomAttribute(field, typeof(DescriptionAttribute));
return customAttribute == null ? @enum.ToString() : ((DescriptionAttribute)customAttribute).Description;
}
个人推测:
本机Windows以及服务器上已经安装了中文文字环境,所以GB2312的对应出问题的CS代码文件通过反射拿到的描述属性内容没有问题。