簡體   English   中英

擴展的ASCII字符,例如歐元符號被轉換為其等效的unicode

[英]Extended ASCII characters such as euro symbol being converted to its unicode equivalent

我將歐元符號存儲在MS-Access數據庫表中:

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文件中。

這兩條線的事實:

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代碼頁),但這有點受歡迎。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM