我将欧元符号存储在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文件中。
答案 0 :(得分: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代码页),但这有点受欢迎。