踩坑记录之 -- String.IndexOf 在 .Net5 和 .Netcore3 中返回值不一样
.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
- 在 MSDN: https://docs.microsoft.com/en-us/dotnet/standard/globalization-localization/globalization-icu 上有提到,并清楚的告知了如何去解决及如何恢复到老的版本。
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
- StringComparison 是一个枚举 用于指定区域性、大小写和排序规则 https://docs.microsoft.com/zh-cn/dotnet/api/system.stringcomparison?view=net-5.0
主要枚举值如下
- 通过以下代码 我们对各个枚举值进行比较
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 中返回值不一样的更多相关文章
- Taro踩坑记录一: swiper组件pagestate定制,swiperChange中setState导致组件不能滚动。
import Taro, { Component } from '@tarojs/taro'; import { Swiper, SwiperItem, Image, View } from '@ta ...
- SpringBoot + Shiro + shiro.ini 的踩坑记录
0.写在前面的话 好久没写博客了,诶,好多时候偷懒直接就抓网上的资料丢笔记里了,也就没有自己提炼,偷懒偷懒.然后最近参加了一个网络课程,要交作业的那种,为了能方便看下其他同学的作业,就写了个爬虫把作业 ...
- 你真的了解字典(Dictionary)吗? C# Memory Cache 踩坑记录 .net 泛型 结构化CSS设计思维 WinForm POST上传与后台接收 高效实用的.NET开源项目 .net 笔试面试总结(3) .net 笔试面试总结(2) 依赖注入 C# RSA 加密 C#与Java AES 加密解密
你真的了解字典(Dictionary)吗? 从一道亲身经历的面试题说起 半年前,我参加我现在所在公司的面试,面试官给了一道题,说有一个Y形的链表,知道起始节点,找出交叉节点.为了便于描述,我把上面 ...
- Unity AssetBundle 踩坑记录
Unity AssetBundle 踩坑记录 editor 下选择什么平台的 ab 加载 Material doesn't have a color property '_Color' UnityEd ...
- manjaro xfce 18.0 踩坑记录
manjaro xfce 18.0 踩坑记录 1 简介1.1 Manjaro Linux1.2 开发桌面环境2 自动打开 NumLock3 系统快照3.1 安装timeshift3.2 使用times ...
- SUCTF 2019 Upload labs 2 踩坑记录
SUCTF 2019 Upload labs 2 踩坑记录 题目地址 : https://github.com/team-su/SUCTF-2019/tree/master/Web/Upload La ...
- unionId突然不能获取的踩坑记录
昨天(2016-2-2日),突然发现系统的一个微信接口使用不了了.后来经查发现,是在网页授权获取用户基本信息的时候,unionid获取失败导致的. 在网页授权获取用户基本信息的介绍中(http://m ...
- CentOS7.4安装MySQL踩坑记录
CentOS7.4安装MySQL踩坑记录 time: 2018.3.19 CentOS7.4安装MySQL时网上的文档虽然多但是不靠谱的也多, 可能因为版本与时间的问题, 所以记录下自己踩坑的过程, ...
- ubuntu 下安装docker 踩坑记录
ubuntu 下安装docker 踩坑记录 # Setp : 移除旧版本Docker sudo apt-get remove docker docker-engine docker.io # Step ...
随机推荐
- 「CF568C」 New Language
「CF568C」 New Language 一眼 \(\texttt{2-SAT}\) . 然后不会了. 又看了一会儿,然后发现只要我们确定每个位置大于字典序的两种最小的字母是啥,然后按位贪心,这个问 ...
- File类与常用IO流第九章——转换流
第九章.转换流 字节编码和字符集 编码:按照某种规则将字符以二进制存储到计算机中. 解码:将存储在计算机中的二进制数按照某种规则解析显示出来. 字符编码:Character Encoding ,就是一 ...
- Kubernetes部署-RKE自动化部署
一.简介 RKE:Rancher Kubernetes Engine 一个极其简单,闪电般快速的Kubernetes安装程序,可在任何地方使用. 二.准备工作 I.配置系统 系统:CentOS 7 / ...
- python基础之函数的应用
#函数应用# 1.语法"""def 函数名(参数): 函数体"""# 2. 没有参数的函数# def readbook():# print( ...
- 为什么要配置java环境变量
Java环境变量,真的还有必要配吗? 作为年龄上堪称老鸟而技术上却是菜鸟的老菜鸟,为了祖国的编程事业,不惜拿出一个月工资,淘了一台配置稍高的二手笔记本,打算与老笔记本中的撸啊撸片彻底说再见,誓要在新机 ...
- SSM中如何上传图片
1.文件配置 2.jsp页面 文件的name值不能跟数据库列名一致 3.控制层收集数据转发到逻辑层 4.逻辑层处理把用户信息存到数据库 5.注册成功后跳到jsp页面进行展示
- Super-Mario-Host(超级玛丽)靶机
仅供个人娱乐 靶机百度云下载 链接:https://pan.baidu.com/s/13l1FUgJjXArfoTOfcmPsbA 提取码:a8ox 一.主机发现 arp-scan -l 二.漏洞扫 ...
- Java数组01——声明创建、赋值及特点
数组声明创建 数组的四个基本特点 例子 package array; public class ArrayDemon01 { //变量的类型 变量的名字 = 变量的值 / ...
- 内置函数 字符串比较 strcmp 登录密码
1 //内置函数 字符串比较 strcmp 2 // 原理:将两个字符串从首字母开始,按照ASCII码的顺序逐个比较 3 //字符串1 == 字符串2 返回0 4 //字符串1 < 字符串2, ...
- 第3篇-CallStub新栈帧的创建
在前一篇文章 第2篇-JVM虚拟机这样来调用Java主类的main()方法 中我们介绍了在call_helper()函数中通过函数指针的方式调用了一个函数,如下: StubRoutines::cal ...