前陣子為了作個資料檢查程式遇到了一個小問題。
資料欄位是固定長度的方式加上空白來區隔,資料有中文也有英文混雜在一起,欄位資料不足就補空白。
為了檢查每個一欄位的長度是否正常,我用確認空白位置的方式來檢查長度是否正確。
在試著輸出各位置的字元時,我發現在 C# 中,中文字元被判定成 1 個字元,並不是 2 個。
但在以前較常用的 BCB、DELPHI、C++ ,是把雙字元當成是二個字元。假設 # 代表的是空白,@ 是我要抓的位置
12345@我是誰@我老爸
12346@JONNY#@Kevin
抓第 2 個空白時,想要的位置是 13,但在 C# 的第一筆是 10,而第二筆全是單字元,所以位置是 13 個沒錯,只是這樣出來的結果就有問題了。
最後找到了解決方式。方法是轉換字串的編碼,大概內容是這樣作。
int[] Candidata = {9, 20, 22, 43, 64, 66, 69, 72, 75, 82, 85, 87, 89, 91, 94, 105, 116, 118, 120, 124, 205, 208, 215, 221, 224, 227, 229};
FileStream fs = new FileStream(openFileDialog1.FileName, FileMode.Open, FileAccess.Read);
StreamReader myStreamReader = new StreamReader(fs, System.Text.Encoding.Default);
string myInputString;
myInputString = myStreamReader.ReadLine();
while (myInputString != null)
{
int errType = 0;
byte[] lineStr = System.Text.Encoding.Default.GetBytes(myInputString);
// check 每行的空白位置是否正確
foreach (int pos in Candidata)
{
String strName = System.Text.Encoding.Default.GetString(lineStr, pos, 1);
if (strName != " ")
{
errType = 2;
break;
}
}
myInputString = myStreamReader.ReadLine();
}
主要是在這裡。
byte[] lineStr = System.Text.Encoding.Default.GetBytes(myInputString);
String strName = System.Text.Encoding.Default.GetString(lineStr, pos, 1);
轉成byte的型態就可以計算字元了。
其實現在的程式設計大多朝向 UniCode 的字元,但有時候要在處理舊的資料時,就會有點不方便。