iT邦幫忙

2023 iThome 鐵人賽

DAY 24
0
自我挑戰組

懶還要更懶,快還要更快。不可不知的小工具和知識系列 第 24

[Day24]不可不知的小工具-string.Length

  • 分享至 

  • xImage
  •  

前言

公司最近要打入越南市場,所以有開始接觸一些越南相關的處理事宜。不知道大家有沒有看過越南文,基本上一個詞都超長xD因為之前都只有做台灣跟中國的市場,所以都不太會有一個詞很長的問題,欄位基本上開個nvarchar(50)就差不多了。今天就來分享一下踩雷過程~

情境提要

我要把下圖的越南文內容透過敲API匯入excel存進DB,資料庫該欄位的大小是nvarchar(500)。而在excel上該欄位輸入的限制字數是250字
已知:在word上這串文字字數為138,所以看起來很合理嘛~
https://ithelp.ithome.com.tw/upload/images/20231008/20162714oIDxO1nOls.jpg

先來認識下面這幾個東西

字元/字符

先來看看維基百科對於字元的定義

在電腦和電信領域中,字元(character)是一個資訊單位。對使用字母系統或音節文字等自然語言,它大約對應為一個音位、類音位的單位或符號。簡單來講就是一個漢字、假名、韓文字……,或是一個英文、其他西方語言的字母。

簡單來說,字元可以說是一個字母、數字、標點符號或空白。像是A12B?3C,這樣就是7個字元

位元組(byte)/字節

再來看看維基百科的說明

通常用作電腦及手機及手錶等 資訊計量單位,不分資料類型。用於編碼單個字元所需要的位元數量

  • 1 byte = 8 bit(位元)

上面的認知都有了,那就讓我們繼續看下去~

string.Length

前面有提到我的字數限制是250,所以我就用了string.Length去做判斷。加上了這段判斷總該符合PM需求了吧也應該要可以成功匯入上面提到的內容,但實際上卻直接噴Exception了。

if(input.Length > 250)
{
    throw new Exception("字數超過限制");
}

原因是什麼呢????查了一下微軟的文件,內容如下:

取得目前 String 物件中字元的數目。

綜合前面的知識就會發現,string.Length這個屬性回傳的結果其實是去計算這個字串裡面的字元數,再白話文一點就是這邊算的會是有多少個字母及空白。
舉例來說: Người lao động,這串越南文透過string.Length回傳出來結果會是14
https://ithelp.ithome.com.tw/upload/images/20231008/20162714cGvuYxwBgL.jpg

如果到這邊大家認知都還一樣,就可以繼續往下看~有了上面的舉例,就可以再套回情境提要的問題了。所以這就是為什麼最前面情境提要會噴掉的原因了。實際把情境提要那串越南文去跑string.Length會發現回傳是618,我的判斷是大於250,那當然會直接丟exception!

中文就不會有爆掉的問題嗎?

等等會用下圖的例子說明
https://ithelp.ithome.com.tw/upload/images/20231008/20162714e7oRcih45B.jpg
把上圖的內容文字用string.Length,回傳結果會是163。雖然看起來也是落落長,但一個國字就代表一個字元,所以不會像越南文一個字母是一個字元但卻還沒辦法組成一個詞。

結論

程式面端的問題找到了,明天就來看進資料庫端會有什麼問題吧!

參考

微軟文件String.Length 屬性

文章同步發布於:https://tw.coderbridge.com/@hsiaovicky567/ba91fc3bf4b3479bbebbe4c0f8053c7f


上一篇
[Day23]不可不知的小工具-SSMS
下一篇
[Day25]不可不知的小工具-LEN() & DATALENGTH()
系列文
懶還要更懶,快還要更快。不可不知的小工具和知識30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言