扩展的 ASCII 字符,例如欧元符号被转换为其 unicode 等价物

Posted

技术标签:

【中文标题】扩展的 ASCII 字符,例如欧元符号被转换为其 unicode 等价物【英文标题】:Extended ASCII characters such as euro symbol being converted to its unicode equivalent 【发布时间】:2012-05-28 19:49:23 【问题描述】:

我将欧元符号存储在 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 spit out 按原样输出扩展的 ASCII 字符?字符应该写在 CSV 文件中。

【问题讨论】:

字符需要放在一个文本文件中——一个 ANSI 文本文件。 (这与现在已删除的评论有关,声称欧元符号不受任何 ANSI 编码覆盖):欧元符号在代码页 1252(西欧)中,值为 128 【参考方案1】:

这两行的事实:

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

【讨论】:

对不起,我无法让示例代码工作,我试过了:System.Text.Encoding enc = System.Text.Encoding.GetEncoding(1252); StreamWriter dataFile = new StreamWriter(dataFilePath, enc);: 'System.IO.StreamWriter.StreamWriter(string, bool)' 的最佳重载方法匹配有一些无效 @Salaman 再看一遍:我有 两个 using - 一个打开 FileStream(二进制,没有编码的概念) - 一个绑定到 Stream 与特定的编码。我没有通过StreamWriter 的路径 - 我通过Stream

以上是关于扩展的 ASCII 字符,例如欧元符号被转换为其 unicode 等价物的主要内容,如果未能解决你的问题,请参考以下文章

将 C/C++ 无符号字符转换为 JAVA 时出现问题

将非 ASCII 字符(变音符号、重音符号...)转换为最接近的 ASCII 等效字符(创建 slug)

在 python 中将字符转换为其 ascii 等价物的最简单方法是啥? [复制]

当前文化 - 显示欧元符号 (€) 而不是 EUR 字符串

如何在 Python 中将单个字符转换为其十六进制 ASCII 值?

求帮助,编码转换的问题 python 3.4.0