zoukankan      html  css  js  c++  java
  • 踩坑记录之 -- String.IndexOf 在 .Net5 和 .Netcore3 中返回值不一样

    .Net Core3.1 下

    运行此段代码

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

    返回结果为 6

    .Net5 下

    运行同样代码

        class Program
        {
            static void Main(string[] args)
            {
                // .NET Core 3.1
                string s = "Hello
    world!";
                int idx = s.IndexOf("
    ");
                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
    world!";
                int idx = s.IndexOf("
    ",StringComparison.Ordinal);
                Console.WriteLine(idx);
    

    输出结果为 6

    • 通过以下代码 我们对各个枚举值进行比较
                string s = "Hello
    world!";
    
                var comparisons = (StringComparison[])Enum.GetValues(typeof(StringComparison));
                foreach (var item in comparisons)
                {
                    Console.WriteLine($"{item}: {s.IndexOf("
    ", item)}");
                }
    

    结果

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

  • 相关阅读:
    同步请求和异步请求的区别
    Ajax初步理解
    ajax的GET和POST请求
    What's this?(js)
    rxjs
    Angular7_获取异步方法里面的数据
    Angular7_人员登记系统
    Angular7
    特殊操作符
    Oracle 表操作
  • 原文地址:https://www.cnblogs.com/Alicia-meng/p/15009467.html
Copyright © 2011-2022 走看看