踩坑记录之 -- String.IndexOf 在 .Net5 和 .Netcore3 中返回值不一样
2024-09-19 06:12:40
.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
最新文章
- php中用foreach改变数组的值的问题
- Android HandlerThread 的使用及其Demo (转)
- 01shell入门基础
- GOCR.js – 使用 JS 识别出图片中的文本
- Python-执行系统命令
- SQLServer 数据导入导出 SSIS 包 位置
- Ubuntu配置java环境变量
- jquery的异步获取返回值为中文时乱码解决方法
- 【LeetCode】6 - ZigZag Conversion
- 【python】疯了,掉坑里出不来了
- Matlab无法打开M文件的错误( Undefined function or method &#39;uiopen&#39; for input arguments of type &#39;char)
- ***OneinStack交互安装FAQ和管理服务常用命令
- java重构四则运算
- JS中的数学方法
- Nand Flash 裸机程序
- LPCSTR与CString转换
- 在Windows 2008上安装Windows Mobile设备中心
- 关于hot miami的沙盒生存俯视角射击游戏
- IDEA开发工具常用快捷键总结
- mysql server has gone away的原因