2012-05-28 85 views
1

我有存储在MS-Access数据库表中的欧元符号:扩展ASCII字符,如欧元符号转换为它的Unicode等效

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

这些字符需要放在一个文本文件中 - 一个ANSI文本文件。 –

+1

(这与现在删除的评论有关,声称欧元符号不包含在任何ANSI编码中):欧元符号在代码页1252(西欧)中,值为128 –

回答

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代码页),但就是有点碰运气。

+0

对不起,但我无法获得示例代码工作,我试过了:'System.Text.Encoding enc = System.Text.Encoding.GetEncoding(1252); StreamWriter dataFile = new StreamWriter(dataFilePath,enc);':'System.IO.StreamWriter.StreamWriter(string,bool)'的最佳重载方法匹配有一些无效 –

+0

@Salaman再次看:我有*两个*'使用' - 打开'FileStream'(二进制,没有编码的概念) - 一个用特定的编码绑定到Stream。我不通过'StreamWriter'的路径 - 我通过'Stream' –

+0

我的不好。它现在有效。 –

相关问题