.NET:StreamReader无法识别°字符

时间:2011-02-11 13:01:08

标签: c# .net regex unicode utf-8

我正在尝试运行RegEx来定位学位字符(\ u00B0 | \ u00BA度除了找到其他形式的' - > \ u00B4)。我正在阅读像这样的经度和经度DMS坐标:12º30'23.256547“S

问题在于我正在阅读文件的方式,因为我可以手动注入类似下面的字符串(格式是纬度,经度,描述):

const string myTestString = @“12º30'23.256547”“S,12º30'23.256547”“W,Somewhere”;

和我的正则表达式按预期匹配 - 我还可以看到º值,当我使用流读取器时,我看到所有无法识别的字符的 (º符号被包含为那些无法识别的字符之一)

我试过了:

            var sr = new StreamReader(dlg.File.OpenRead(), Encoding.UTF8);
            var sr = new StreamReader(dlg.File.OpenRead(), Encoding.Unicode);
            var sr = new StreamReader(dlg.File.OpenRead(), Encoding.BigEndianUnicode);

除了默认的ASCII。

无论哪种方式我都读了这个文件,我最终得到了这些特殊字符。任何建议将不胜感激!!

2 个答案:

答案 0 :(得分:3)

您尝试了各种编码......但可能不是正确的编码。你不应该只是猜测编码 - 找出它真正使用的编码,并使用它。 StreamReader本身绝对没问题。它可以处理您提供的任何编码,但它必须与编写文件时使用的编码相匹配。

该文件来自哪里?是什么写的?

如果是用记事本写的,可能正在使用Encoding.Default,这是系统的默认编码(即它会因机器而异)。如果可能的话,更改创建文件的任何内容以使用单个标准编码 - 我个人非常喜欢UTF-8。

答案 1 :(得分:1)

您需要确定保存文件的编码方式,并在使用您的streamreader阅读时使用该文件。

如果是使用普通的texteditor创建的,我猜测默认编码是Windows-1252或ISO-8859-1。

ISO-8859-1中的度数符号为0xBA,超出了7bit ASCII表。我不知道Encoding.ASCII如何解释它。

否则,如果您有这种可能性,可能更容易确保将文件保存为UTF-8。

在代码中定义字符串时它起作用的原因是因为.NET将始终使用带有内部编码的字符串(UCS-2?),因此StreamReader所做的是将它从文件中读取的字节转换为使用您在创建StreamReader时指定的编码进行内部编码。