现在手头上的一个项目,要求读取本地的一个txt文本,格式为:以逗号分隔,内容为字母数字或下划线组成的字符串,需要一条条写入数据库。
     实现为先将txt上传至服务器,在后台程序读取,然后做正则验证。
     后台读取与正则如下所示:
     
     StreamReader sr = File.OpenText(filePath);
                                while ((input = sr.ReadLine()) != null)
                                {
                                    nodeContext = nodeContext + input;
                                }
                                sr.Close();
                                Regex re = new Regex("^[A-Za-z0-9_,]+$", RegexOptions.IgnoreCase);                                if (!re.IsMatch(nodeContext))
                                {
                                    return false;
                                }
本地系统为XP系统,在本地运行时,txt文档中如有全角字符,读取时,全角字符将会变为乱码,验证通不过。
服务器系统为windows 2003,上传至服务器后,txt文档中如有全角字符,读取时,全角字符会变为空字行串。也就是当文档中是abcC,def,123在服务器读取时会变为abcdef,123(代码中在读取txt的时候写入日志了,查看得到的字符串),验证通过,程序逻辑错误很显然的为编码格式问题,OpenText的函数说明是:打开现有UTF-8编码文本文件以进行读取。我猜测编码格式为当前系统的默认编码方式(很杯具,服务器上的vs版本和我机器上的版本不一致,不能调试,一般情况下应该都为UTF-8,)。我在本地测试了一下按编码读取,使用的方法为string[] sr = File.ReadAllLines(filePath, Encoding.BigEndianUnicode);测试了UTF-8, BigEndianUnicode,ASCII,UTF7,Unicode,UTF32,Default(这种模式读出来,在本地机器为原样输出,即abcC,def,123)。这些编码方式读出来的字符串中的全角全部都为乱码,我很奇怪在服务器上的全角怎么给忽略了,有谁知道的请讲讲吧!倒底是哪种编码方式导致的(本机器测试不是已知的编码方式导致的),这是否可解释在webForm中,轻量级Excel导出里为何要将编码方式设定为Encoding.Default?

解决方案 »

  1.   

    这是msdn上的解释:
    若要获取与操作系统区域和语言设置中的默认 ANSI 代码页相关联的编码,应用程序应当使用 GetEncoding(0) 或 Default 属性。若要确定操作系统中使用的默认代码页,应用程序可以使用 Windows API 函数 GetSystemDefaultLangID。若要确定当前的 ANSI 代码页,应用程序可以使用 Windows API 函数 GetACP。警告 
    不同的操作系统可能会将不同的编码用作默认编码。因此,从一个操作系统流向其他操作系统的数据可能转换不正确。若要确保编码后的字节能够正确解码,应用程序应当使用带前导码的 Unicode 编码(即 UTF8Encoding、UnicodeEncoding 或 UTF32Encoding)。另一选择是使用较高级别的协议以确保使用同一格式进行编码和解码。
     由 Default 定义的系统 ANSI 代码页包含 ASCII 字符集,但是其编码不同于 ASCII 的编码。由于所有的 Default 编码会丢失数据,因此应用程序可以改用 UTF8 或 Encoding。在 U+00 到 U+7F 的范围内,UTF-8 通常是相同的,但是可以在不丢失数据的情况下对其他字符进行编码。