扩展的 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 等价物的主要内容,如果未能解决你的问题,请参考以下文章
将非 ASCII 字符(变音符号、重音符号...)转换为最接近的 ASCII 等效字符(创建 slug)
在 python 中将字符转换为其 ascii 等价物的最简单方法是啥? [复制]