.NET Core中關於阿拉伯語環境下的坑:Input string was not in a correct format.

2023-07-19 18:01:32

結論

.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-開頭的語言)時報錯,但是本地跑正常的

問題排查

  1. 看紀錄檔

    通過紀錄檔不難發現,是獲取快取時,CSRedis丟擲的異常,而本地偵錯時,未連線redis伺服器,初步猜測,是redis出了問題
  2. 校驗redis
  • 本地連線redis(和測試服同一臺redis伺服器)偵錯,當切到阿拉伯語時,果然出現了同樣的錯誤。說明就是切換了語言,導致了redis的報錯,但是很不解,多語言跟redis有啥關係呢?
  • 猜測是快取的資料問題,嘗試清空redis快取,但問題依舊;
  • 猜測是key的問題,校驗時有所發現,再次說明就是阿拉伯語導致的
    • 當切換成阿拉伯語時,redis中存在的key可以正常查出,不存在的key報錯
    • 當切換成非阿拉伯語時,一切正常,不存在的key會返回null
  • 此時猜測可能是CSRedis的程式碼有問題,看紀錄檔中的"Input string was not in a correct format."就是CSRedis丟擲的,CSRedis是一個開源專案,CSRedis原始碼地址
  1. 矛頭指向CSRedis
  • 找到專案參照對應CSRedis原始碼,本地新建一個控制檯專案,連線測試的redis伺服器,開始偵錯CSRedis原始碼,一切正常
  • 此時CultureInfo.CurrentCultureCultureInfo.CurrentUICulture獲取到的是zh-hans,猜測如果把zh-hans改成ar-ER(阿拉伯語的一種)是不是就會報錯?
  1. 勝利在望
  • CultureInfo.CurrentCultureCultureInfo.CurrentUICulture改成ar-ER之後,果然報錯出現了(終於看到了勝利的曙光,此時我已經被這個問題搞了3-4天了。。。)
  • 初步結論:就是CSRedis的程式碼有問題,當語言環境是阿拉伯語的時候,CSRedis就會報錯(內心想:寫得什麼 ** 玩意兒,害得我搞了幾天,但是最終結果證明,我還是年輕了。。。)
  1. 最終揭祕
  • 開始一步步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")等,將負數位符串轉成數位的方法,都會報錯,這個就是最終結論
  1. 解決辦法
  • 現在問題找到了,怎麼去解決呢?難道是微軟在制裁阿拉伯語人?為啥會有這麼的大的bug呢?找了一圈資料,沒啥說法
  • 於是請教了楊中科老師,解決辦法就是開頭說的,使用過載方法加上CultureInfo.InvariantCulture引數,即不匹配任何文化資訊,參考官方檔案
  1. 探究根本
  • 還是要從CultureInfo說起,其中有一個屬性NumberFormat,包含了當前語言的數位格式,可參考官方檔案NumberFormatInfo型別中NegativeSign用於定義負號
  • 偵錯時,發現在阿拉伯語環境下,負號並不是"-",而是"?-",但是又不是中/英文輸入法下的問號,應該是有個什麼特殊字元,總之,感覺是"-1"在阿拉伯語裡面並不是表示-1(如果有學過阿拉伯語的朋友可以解答下)

踩坑總結

  • 表面上看似毫不相關的兩個東西,有時候確實能相互影響
  • 問題排查不能停留在表面,要進去
  • 排除法和控制變數法yyds,多用