Printable驗證
資料表中有某欄位供使用者自行輸入、Excel匯入,目前有需求使用該欄位資料來進行比對,卻有幾筆資料看上去值相同,比對結果卻不相符
查看後發現該值結尾有個Tab字元,且oracle sql加上trim也沒有去除,可能是因為以往並沒有使用該欄位作為比對依據,所以一直沒發現問題
先將oracle DB資料修正,目前先針對ascii 1至ascii 31清掉,但是還不確定是不是這樣就能清除所有non-printable字元,如果還有遺漏的還要再修改
update targetTable
set targetColumn = REGEXP_REPLACE(targetColumn , '[' || CHR(1) || '-' || CHR(31) || ']', '')
where regexp_like(targetColumn , '[' || CHR(1) || '-' || CHR(31) || ']')
.net MVC加入ViewModel驗證屬性,只允許該欄位儲存printable字元,目前使用char.IsControl判斷
/// <summary> 驗證字串為Printable </summary>
public class PrintableStr : ValidationAttribute
{
protected override ValidationResult IsValid(object value, ValidationContext validationcontext)
{
if (value == null || string.IsNullOrEmpty(value.ToString()))
{
return ValidationResult.Success;
}
string strValue = value.ToString();
if (strValue.Any(c => char.IsControl(c)))
{
return new ValidationResult("不可包含non-printable字元(如:Tab、換行符號等)");
}
return ValidationResult.Success;
}
}
正規表示似乎也能達到相同效果
new Regex(@"\p{C}+").IsMatch(inputStr)
接著再套ModelState驗證就可以了,順便檢查下還有哪些欄位需要用於比對卻可能包含non-printable字元
之後又測試了C#的Trim(),可以去除Tab,如果只要去除字首字尾的non-printable字元似乎也可以使用C# Trim()
參考
https://stackoverflow.com/questions/11137947/print-non-printable-characters-in-a-given-string