前陣子為了作個資料檢查程式遇到了一個小問題。

資料欄位是固定長度的方式加上空白來區隔,資料有中文也有英文混雜在一起,欄位資料不足就補空白。
為了檢查每個一欄位的長度是否正常,我用確認空白位置的方式來檢查長度是否正確。

在試著輸出各位置的字元時,我發現在 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 的字元,但有時候要在處理舊的資料時,就會有點不方便。

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 基因 的頭像
    基因

    老骨頭先生

    基因 發表在 痞客邦 留言(0) 人氣()