2012-05-28 108 views
1

我有存儲在MS-Access數據庫表中的歐元符號:擴展ASCII字符,如歐元符號轉換爲它的Unicode等效

SELECT 
CurrencySymbol, 
Len(CurrencySymbol) AS DataLength, 
Asc(CurrencySymbol) AS AsciiCode 
FROM table1; 

CurrencySymbol DataLength AsciiCode 
-------------- ---------- --------- 
€    1   128 

這裏是我用來閱讀的.NET代碼表:

OleDbConnection connection = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + args[0]); 
connection.Open(); 
OleDbCommand command = new OleDbCommand("SELECT * FROM [table1]", connection); 
OleDbDataReader reader = command.ExecuteReader(); 
while (reader.Read()) 
{ 
    for (i = 0, j = reader.FieldCount; i < j; i++) 
    { 
     System.Diagnostics.Debug.Print(reader.GetValue(i)); 
    } 
} 

本來,我是在用數據寫入StreamWriter到一個文本文件中。我注意到歐元符號寫爲€,這可能是用UTF-8編碼的歐元符號的unicode。調試結果:

reader.GetValue(i).ToString()     -> "€" 
reader.GetValue(i).ToString().ToCharArray()[0] -> 8364 '€' 

我怎麼能強制執行.NET來吐出輸出的擴展ASCII字符按原樣?這些字符應該被寫入一個CSV文件。

+0

這些字符需要放在一個文本文件中 - 一個ANSI文本文件。 –

+1

(這與現在刪除的評論有關,聲稱歐元符號不包含在任何ANSI編碼中):歐元符號在代碼頁1252(西歐)中,值爲128 –

回答

3

這兩行的事實:

reader.GetValue(i).ToString()     -> "€" 
reader.GetValue(i).ToString().ToCharArray()[0] -> 8364 '€' 

做你想做的告訴我,我們可以停止尋找在數據訪問和MS Access,「因爲這是所有工作的罰款。問題很簡單:將其寫入文件。那麼,當你創建StreamWriter時,訣竅是明確的。如果你看看StreamWriter的構造函數,你會發現有些函數需要Encoding。如果您保留空白,它將默認爲UTF-8。所以:不要留下空白。明確傳遞您選擇的Encoding。我建議你找出正是你的意思是它的代碼頁和使用:

const int CodePage = ....; // TODO: only you know this 
var enc = Encoding.GetEncoding(CodePage); 
using(var file = File.Create(path)) 
using(var writer = new StreamWriter(file, enc)) { 
    ... // write the contents 
} 

您也可以使用Encoding.Default(系統的默認ANSI代碼頁),但就是有點碰運氣。

+0

對不起,但我無法獲得示例代碼工作,我試過了:'System.Text.Encoding enc = System.Text.Encoding.GetEncoding(1252); StreamWriter dataFile = new StreamWriter(dataFilePath,enc);':'System.IO.StreamWriter.StreamWriter(string,bool)'的最佳重載方法匹配有一些無效 –

+0

@Salaman再次看:我有*兩個*'使用' - 打開'FileStream'(二進制,沒有編碼的概念) - 一個用特定的編碼綁定到Stream。我不通過'StreamWriter'的路徑 - 我通過'Stream' –

+0

我的不好。它現在有效。 –

相關問題