扩展的 ASCII 字符(如欧元符号)将转换为其等效的 unicode

本文关键字:转换 unicode 符号 字符 ASCII 扩展 | 更新日期: 2023-09-27 18:35:37

我将欧元符号存储在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文件中。

扩展的 ASCII 字符(如欧元符号)将转换为其等效的 unicode

事实上,这两行:

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 代码页),但这有点命中。