前陣子在 依字位 (grapheme) 處理字串 這篇文章中有以越南文為例提到 grapheme 的問題,後來覺得 TextElementEnumerator 提供的方法不夠多,所以基於他另外封裝了一個仿 String 的類別,折騰了幾天常用的都寫得差不多了才發現繞遠路做了不少原本 string 就有提供的功能。
主要問題
主要問題是因為 unicode 的幾種不同的標準化格式,導致字面上一樣的字其實是不同的內容,造成字串在比對的時候 (== 運算子) 會認為雙方是不同的字。
關於標準化格式就放連結在這邊就好,要看再慢慢看:
解決方案
String
其實 String 提供的不少方法就有包含到這個問題,通常透過方法中的 StringComparison 或 CultureInfo 參數來做。
String.Normalize(...)
這個方法可以將字串轉為特定的標準化格式,轉換後可以直接比對字串不需要考慮格式問題
避免用
String.Normalize(...)做字串取代後輸出,轉化後的內容和輸入內容不同這樣做容易出意外,例如: 預期沒有要取代的內容卻被轉化成不同的格式後輸出。
用 TextElementEnumerator
這就和之前那篇一樣了。
結論
優先使用 string 提供的方法,包含 String.Normalize(...),兩者都不合用時再考慮 TextElementEnumerator,不要一開始就繞遠路。