.NET Core中关于阿拉伯语环境下的坑:Input string was not in a correct format.
结论
.NET Core项目(.NET Framework没出现)在阿拉伯语(即语言名称是ar-开头的语言)环境下,将负数字符串转成数字,即int.Parse("-1")或Convert.ToInt32("-1")时,会抛出异常“Input string was not in a correct format.”
解决办法
使用重载方法,int.Parse("-1",CultureInfo.InvariantCulture)或Convert.ToInt32("-1",CultureInfo.InvariantCulture)
========================= 分界线 ======================
下面记录一下踩坑的经过
事情起因
基于ABP框架开发的项目,测试服切换多语言时报500错误,当切到阿拉伯语相关语言(即ar-开头的语言)时报错,但是本地跑正常的
问题排查
- 看日志

通过日志不难发现,是获取缓存时,CSRedis抛出的异常,而本地调试时,未连接redis服务器,初步猜测,是redis出了问题 - 校验redis
- 本地连接redis(和测试服同一台redis服务器)调试,当切到阿拉伯语时,果然出现了同样的错误。说明就是切换了语言,导致了redis的报错,但是很不解,多语言跟redis有啥关系呢?
- 猜测是缓存的数据问题,尝试清空redis缓存,但问题依旧;
- 猜测是key的问题,校验时有所发现,再次说明就是阿拉伯语导致的
- 当切换成阿拉伯语时,redis中存在的key可以正常查出,不存在的key报错
- 当切换成非阿拉伯语时,一切正常,不存在的key会返回null
- 此时猜测可能是
CSRedis的代码有问题,看日志中的"Input string was not in a correct format."就是CSRedis抛出的,CSRedis是一个开源项目,CSRedis源码地址
- 矛头指向CSRedis
- 找到项目引用对应CSRedis源码,本地新建一个控制台项目,连接测试的redis服务器,开始调试CSRedis源码,一切正常
- 此时
CultureInfo.CurrentCulture和CultureInfo.CurrentUICulture获取到的是zh-hans,猜测如果把zh-hans改成ar-ER(阿拉伯语的一种)是不是就会报错?
- 胜利在望
- 把
CultureInfo.CurrentCulture和CultureInfo.CurrentUICulture改成ar-ER之后,果然报错出现了(终于看到了胜利的曙光,此时我已经被这个问题搞了3-4天了。。。) - 初步结论:就是CSRedis的代码有问题,当语言环境是阿拉伯语的时候,CSRedis就会报错(内心想:写得什么 ** 玩意儿,害得我搞了几天,但是最终结果证明,我还是年轻了。。。)
- 最终揭秘
- 开始一步步F11调试,最终发现在
Int64.Parse(line.Tostring())时报错"Input string was not in a correct format.",并且是微软报出来的(给CSRedis道歉,立刻,马上。。。),此时line.Tostring()的值是"-1"(下面是CSRedis源码中的片段)

- 立马在阿拉伯语的环境下,测试了一下
Int64.Parse("-1"),果不其然,除此之外Int16.Parse("-1")、Int32.Parse("-1")、Convert.ToInt64("-1")、Convert.ToInt32("-1")等,将负数字符串转成数字的方法,都会报错,这个就是最终结论
- 解决办法
- 现在问题找到了,怎么去解决呢?难道是微软在制裁阿拉伯语人?为啥会有这么的大的bug呢?找了一圈资料,没啥说法
- 于是请教了杨中科老师,解决办法就是开头说的,使用重载方法加上
CultureInfo.InvariantCulture参数,即不匹配任何文化信息,参考官方文档

- 探究根本
- 还是要从
CultureInfo说起,其中有一个属性NumberFormat,包含了当前语言的数字格式,可参考官方文档,NumberFormatInfo类型中NegativeSign用于定义负号

- 调试时,发现在阿拉伯语环境下,负号并不是"-",而是"?-",但是又不是中/英文输入法下的问号,应该是有个什么特殊字符,总之,感觉是"-1"在阿拉伯语里面并不是表示-1(如果有学过阿拉伯语的朋友可以解答下)

踩坑总结
- 表面上看似毫不相关的两个东西,有时候确实能相互影响
- 问题排查不能停留在表面,要进去
- 排除法和控制变量法yyds,多用
.NET Core中关于阿拉伯语环境下的坑:Input string was not in a correct format.的更多相关文章
- Android简易项目--傻瓜式阿拉伯语输入法(Dummy Arabic Input)
一.应用名称 Android简易项目--傻瓜式阿拉伯语输入法(Dummy Arabic Input) 二.应用图标 三.应用说明 现在通行的阿拉伯语键盘布局并无规律可循,阿拉伯语使用者需要花费较多时间 ...
- java中HashMap在多线程环境下引起CPU100%的问题解决(转)
最近项目中出现了Tomcat占用CPU100%的情况,原以为是代码中出现死循环,后台使用jstack做了dump,发现是系统中不合理使用HashMap导致出现了死循环(注意不是死锁). 产生这个死循环 ...
- java中HashMap在多线程环境下引起CPU100%的问题解决
最近项目中出现了Tomcat占用CPU100%的情况,原以为是代码中出现死循环,后台使用jstack做了dump,发现是系统中不合理使用HashMap导致出现了死循环(注意不是死锁). 产生这个死循环 ...
- Python中logging在多进程环境下打印日志
因为涉及到进程间互斥与通信问题,因此默认情况下Python中的logging无法在多进程环境下打印日志.但是查询了官方文档可以发现,推荐了一种利用logging.SocketHandler的方案来实现 ...
- .NET Core 图片操作在 Linux/Docker 下的坑
一.前言 .NET Core 目前更新到2.2了,但是直到现在在 .NET Core 本身依然不包括和图片有关的 Image.Bitmap 等类型.对于图片的操作在我们开发中很常见,比如:生成验证码. ...
- HttpClient在多线程环境下踩坑总结
问题现场 在多线程环境下使用HttpClient组件对某个HTTP服务发起请求,运行一段时间之后发现客户端主机CPU利用率呈现出下降趋势,而不是一个稳定的状态. 而且,从程序日志中判断有线程处于han ...
- 利用n 升级工具升级Node.js版本及在mac环境下的坑
一.利用n 升级Node.js 最近在用NPM安装一个nodejs工具时发现,我的nodejs的版本有些旧了.这不是大问题,只要升级就可以了,当然,重新从nodejs.org最新版本是一种方法,但我想 ...
- 嵌入式中 动态阿拉伯语字符串 转换 LCD显示字符串【感谢建国雄心】
本文参考CSDBN:建国雄心 的博客,这里找不到该帖子,放一个类似的仅供参考https://blog.csdn.net/qiaojiongzeng6321/article/details/748572 ...
- windows环境vagrant修改静态资源文件,centos虚拟机中nginx的web环境下不生效
最近上手krpano,本地修改了krpano.html文件或者xml文件,在虚拟机环境打开文件是修改过来了,在nginx中就是不生效. 修改nginx.conf中http{}中的 sendfile ...
- ASP.NET Core中如影随形的”依赖注入”[下]: 历数依赖注入的N种玩法
在对ASP.NET Core管道中关于依赖注入的两个核心对象(ServiceCollection和ServiceProvider)有了足够的认识之后,我们将关注的目光转移到编程层面.在ASP.NET ...
随机推荐
- CentOS配置Django虚拟环境--坑点总结
1.CentOS原装有python2.7,编译安装python3.X版本 2.sqlite-devel未安装 3.sqlite3版本过低报错 升级sqlite3版本 参考 https://blog.c ...
- [OpenCV-Python] 6 OpenCV 中的绘图函数
文章目录 OpenCV-Python: II OpenCV 中的 Gui 特性 6 OpenCV 中的绘图函数 6.1 画线 6.2 画矩形 6.3 画圆 6.4 画椭圆 6.5 画多边形 6.6 在 ...
- cf1774f解题报告
Magician and Pigs 分析一下三个操作分别干了些什么 新添一只猪 使血量为 \(x\) 的猪血量变为 \(\max(x-v,0)\) 设前面操作后猪总共会受到 \(s\) 的伤害,复制一 ...
- 【Vue2】编程式路由导航
在Vue Router中,除了使用 创建 a 标签来定义导航链接之外,还可以使用Vue Router通过编写代码来实现导航. 他提供的三个实例方法:router.push.router.replace ...
- Java动态调用实体的get方法
/** * 动态调用实体的get方法(注意返回值) * @param dto 实体 * @param name 动态拼接字段 * @return {@link String} * @date 2021 ...
- 【python爬虫】对于微博用户发表文章内容和评论的爬取
此博客仅作为交流学习 对于喜爱的微博用户文章内容进行爬取 (此部分在于app页面进行爬取,比较方便) 分析页面 在这里进行json方法进行,点击Network进行抓包 发现数据加载是由这个页面发出的, ...
- 2022-04-22:给你两个正整数数组 nums 和 target ,两个数组长度相等。 在一次操作中,你可以选择两个 不同 的下标 i 和 j , 其中 0 <= i, j < nums.leng
2022-04-22:给你两个正整数数组 nums 和 target ,两个数组长度相等. 在一次操作中,你可以选择两个 不同 的下标 i 和 j , 其中 0 <= i, j < num ...
- 2021-02-14:假设有排成一行的N个位置,记为1~N,N 一定大于或等于 2,开始时机器人在其中的M位置上(M 一定是 1~N 中的一个)。如果机器人来到1位置,那么下一步只能往右来到2位置;如果机器人来到N位置,那么下一步只能往左来到 N-1 位置;如果机器人来到中间位置,那么下一步可以往左走或者往右走;规定机器人必须走 K 步,最终能来到P位置(P也是1~N中的一个)的方法有多少种?
2021-02-14:假设有排成一行的N个位置,记为1~N,N 一定大于或等于 2,开始时机器人在其中的M位置上(M 一定是 1~N 中的一个).如果机器人来到1位置,那么下一步只能往右来到2位置:如 ...
- save() prohibited to prevent data loss due to unsaved related object 'item_n
问题描述: save() prohibited to prevent data loss due to unsaved related object 'item_no 原因分析: 原来的目的是保存数据 ...
- ModuleNotFoundError: No module named 'flask_sqlalchemy'
ModuleNotFoundError: No module named 'flask_sqlalchemy' 解决: pip install flask_sqlalchemy