.NET 6 Linux Docker环境文件名变音符号去除失败问题排查
去除变音符号在Windows与Linux Docker环境的差异问题及解决方法
处理前端传入的文件名时,遇到去除变音符号(Diacritics)的问题:参考方案在Windows环境的.NET 6标准模板控制台程序中可正常运行,但在Linux Docker部署的后端应用中失效。具体表现为:字符“é”执行Normalize(NormalizationForm.FormD)时无法拆分为“e”和非间距标记,仍保留为ASCII 233字符,最终被RemoveNonAscii方法直接删除而非替换。
使用的代码如下:
mystring.RemoveDiacritics().RemoveNonAscii(); public static string RemoveDiacritics(this string text) { string text2 = text.Normalize(NormalizationForm.FormD); StringBuilder stringBuilder = new StringBuilder(text2.Length); foreach (char c in text2) { if (CharUnicodeInfo.GetUnicodeCategory(c) != UnicodeCategory.NonSpacingMark) { stringBuilder.Append(c); } } return stringBuilder.ToString().Normalize(NormalizationForm.FormC); } public static string RemoveNonAscii(this string text) { return Regex.Replace(text, @"[^\u0000-\u007F]+", string.Empty); }
环境差异原因
.NET 6在Linux环境下默认启用**不变全球化(Invariant Globalization)**模式,该模式使用简化的全球化数据,不支持完整的Unicode规范化操作(如将带变音符号的字符拆分为基础字符+非间距标记);而Windows环境默认依赖系统自带的完整Unicode支持库,可以正常执行Normalize(FormD)的拆分逻辑,因此出现跨环境行为不一致的问题。
解决方法
在Dockerfile中添加以下命令,安装完整的ICU库及数据:
RUN apk add --no-cache icu-libsRUN apk add --no-cache icu-data-full
在项目的
.csproj文件中添加配置,禁用不变全球化模式:<InvariantGlobalization>false</InvariantGlobalization>
内容的提问来源于stack exchange,提问作者Adrien Pigenel
相关产品推荐
相关产品推荐

