.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,多用
本文来自博客园,作者:汪小让,转载请注明原文链接:https://www.cnblogs.com/wangxiaorang/p/17565350.html