繁体   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