首页 > Web开发 > 详细

踩坑记录之 -- String.IndexOf 在 .Net5 和 .Netcore3 中返回值不一样

时间:2021-07-14 11:54:49      阅读:12      评论:0      收藏:0      [点我收藏+]

.Net Core3.1 下

运行此段代码

    class Program
    {
        static void Main(string[] args)
        {
            // .NET Core 3.1
            string s = "Hello\r\nworld!";
            int idx = s.IndexOf("\n");
            Console.WriteLine(idx);
        }
    }

返回结果为 6

.Net5 下

运行同样代码

    class Program
    {
        static void Main(string[] args)
        {
            // .NET Core 3.1
            string s = "Hello\r\nworld!";
            int idx = s.IndexOf("\n");
            Console.WriteLine(idx);
        }
    }

返回结果为 -1

解决

全局

  • 依据
    • 在 MSDN: https://docs.microsoft.com/en-us/dotnet/standard/globalization-localization/globalization-icu 上有提到,并清楚的告知了如何去解决及如何恢复到老的版本。
      在过去,.NET 的全球化API 在不同的平台上会使用不同的底层工具包,比如:
      Unix 上的 全球化API 会调用 ICU 工具包 (International Components for Unicode)
      Windows 上的 全球化API 会调用 NLS 工具包 (National Language Support)
      不用的工具包呈现的行为肯定会有一些不一样,影响范围大致包括:
      本地化和本地化数据
      string 的一些操作 (转换,排序,查找)
      zone 和 IDN

2019年5月, windows 做了一个补丁升级,让后续的 .NET 全球化API 由原来的 NLS 切换到了 ICU 模式,这就是在后续的 .NET5 表现不一致的根源,如果你想退回到 NLS,需要做如下配置。

  • 修改project文件
<ItemGroup>
  <RuntimeHostConfigurationOption Include="System.Globalization.UseNls" Value="true" />
</ItemGroup>
  • 修改runtimeconfig.json
{
  "runtimeOptions": {
     "configProperties": {
       "System.Globalization.UseNls": true
      }
  }
}
  • 新增环境变量 DOTNET_SYSTEM_GLOBALIZATION_USENLS = 1

局部

你可以使用 StringComparison.Ordinal 来指定字符串比较规则

            string s = "Hello\r\nworld!";
            int idx = s.IndexOf("\n",StringComparison.Ordinal);
            Console.WriteLine(idx);

输出结果为 6

技术分享图片

  • 通过以下代码 我们对各个枚举值进行比较
            string s = "Hello\r\nworld!";

            var comparisons = (StringComparison[])Enum.GetValues(typeof(StringComparison));
            foreach (var item in comparisons)
            {
                Console.WriteLine($"{item}: {s.IndexOf("\n", item)}");
            }

结果
技术分享图片

可得 通过StringComparison.Ordinal/OrdinalIgnoreCase 可获取同样的Index

踩坑记录之 -- String.IndexOf 在 .Net5 和 .Netcore3 中返回值不一样

原文:https://www.cnblogs.com/Alicia-meng/p/15009467.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!