[英]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.