都是Encoding(编码方式)惹的祸

最近在做项目时,碰到一个棘手的问题,问题描述如下:

问题描述一:
在做单元测试的时候,需要为数据库初始化一些测试数据,就手工创建了一个包含大量Insert语句的脚本文件,用来往数据库插入数据,用如下的语句完成插入动作:
    OSQL -S 192.168.1.28 -U sa -P sa -i "c:\test.sql"
命令完成后,数据被成功插入相应表中。打开NUnit运行测试用例,部分测试用例不过,颇费周折后发现,其中的三个特殊字符在被插入到数据库后被转换成了其他字符,这三个字符是三个丹麦字符(øåæ)。所以在做字符串比较时与给定的字符串不等。

问题的是找到了,可原因何在呢。打开脚本文件,拷贝粘贴SQL语句至查询分析器中运行,检查结果无误,看来问题就出在OSQL读取文件时出错。在DOS命令窗口中运行 type c:\test.sql 来查看内容,结果出现预期的情况,三个特殊字符不能被正确读取。用记事本打开文件,然后另存文件,发现文件的编码方式是ANSI编码,试着将文件另存成Unicode编码,再用OSQL执行,结果终于正常。

问题被解决,以为事情可以告一段落,没想到新的问题在第二天又出现了,问题描述如下:

问题描述二:
公司采用SourceOffSite管理项目文档,将test.sql文件上传到SOS服务器后,再下载下来,便出现了新的情况,打开文件一看,傻眼了,文件全变成了乱码,SOS不能识别Unicode文件,将test.sql文件另存成ANSI编码方式,再上传到服务,再下载下来观察,结果正常。

新的问题原因找到了,便有了如下的解决方案:
既然SOS服务不能存储Unicode编码方式文本文件,只能仍然将脚本文件存成ANSI格式,这样便解决了问题二。再运行OSQL命令前,用如下的代码先将文件另存成Unicode编码方式再转交给OSQL工具使用,问题一得以解决。

将文本文件另存成Unicode (C#版)

None.gif private   void  ChangeTextEncoding( string  folder)
ExpandedBlockStart.gifContractedBlock.gif        
dot.gif {
InBlock.gif            
string file = folder + "\\test.sql";
InBlock.gif            
string dataFile = folder + "\\BMS_TestData.sql";
InBlock.gif            
if(System.IO.File.Exists(file)) return;
InBlock.gif            
using (StreamWriter sw = new StreamWriter(file,true,System.Text.Encoding.Unicode)) 
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                
using (StreamReader sr = new StreamReader(dataFile,System.Text.Encoding.Default)) 
ExpandedSubBlockStart.gifContractedSubBlock.gif                
dot.gif{
InBlock.gif                    String line;
InBlock.gif                    
while ((line = sr.ReadLine()) != null
ExpandedSubBlockStart.gifContractedSubBlock.gif                    
dot.gif{
InBlock.gif                        sw.WriteLine(line);
ExpandedSubBlockEnd.gif                    }

ExpandedSubBlockEnd.gif                }

ExpandedSubBlockEnd.gif            }

ExpandedBlockEnd.gif        }

转载于:https://www.cnblogs.com/zengdj/archive/2005/07/08/188571.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值