【发布时间】:2018-05-01 21:25:47
【问题描述】:
我有一个用 C# 编写的 ASP.Net 4.0 Web 应用程序,它所做的其中一件事是根据从 SQL Server 2012 查询中提取的数据将文件写入文件系统。有时用户输入包含来自法语的字符,经常从 Microsoft Word 剪切和粘贴,因此采用 ANSI 编码。然后,我的 Web 应用程序创建的这个文件通过我无法控制的代码(即不在我的 Web 应用程序中)加载到另一个程序中。问题是第二个程序需要 UTF-8 编码。我已经编写了将程序的输出转换为 UTF-8 的代码,但它仍然无法正确加载,所以我认为我做错了什么。这是我的代码:
protected void writeToClientFile(DataSet ClientGenl, DataSet ClientBus, DataSet ClientBill)
{
FileStream fileStream = null;
string fileName = "ClientTest.txt";
string pathName = ConfigurationSettings.AppSettings["EliteFilePath"].ToString();
try
{
using (new KLClassLibrary.Impersonator(proxyaccount, domain, password))
{
fileStream = OpenASAP(pathName + fileName, 10);
using (TextWriter tw = new StreamWriter(fileStream))
{
foreach (DataRow rowGeneral in ClientGenl.Tables[0].Rows)
{
string fileTextGeneral = "CLNUM:" + rowGeneral["clnum"].ToString().toEliteInput();
byte[] originalBytes = Encoding.Default.GetBytes(fileTextGeneral);
byte[] convertedBytes = Encoding.Convert(Encoding.Default, Encoding.UTF8, originalBytes);
char[] convertedChars = new char[Encoding.UTF8.GetCharCount(convertedBytes, 0, convertedBytes.Length)];
Encoding.UTF8.GetChars(convertedBytes, 0, convertedBytes.Length, convertedChars, 0);
string convertedString = new string(convertedChars);
tw.WriteLine(convertedString);
}
}
}
}
catch (Exception ex)
{
throw ex;
}
finally
{
if (fileStream != null)
fileStream.Dispose();
}
}
FileStream OpenASAP(string path, int maxTries)
{
FileStream fs = null;
bool lastResult = false;
int count = 0;
while ((lastResult == false) && count < maxTries)
{
lastResult = TryOpen(path, out fs);
Thread.Sleep(100);
count++;
}
if (!lastResult || count >= maxTries)
{
throw new Exception("The file is being written to");
}
return fs;
}
bool TryOpen(string FileWithPath, out FileStream fs)
{
try
{
fs = File.Open(FileWithPath, FileMode.Append, FileAccess.Write, FileShare.None);
return true;
}
catch (Exception ex)
{
fs = null;
return false;
}
}
【问题讨论】:
-
rowGeneral["clnum"].ToString().toEliteInput()实际上给出什么样的输出?不知道这一点,就没有办法解决这个问题。 -
另请注意... all 现代 Windows 版本上的 Windows 剪贴板提供 UTF-8 文本,如果您使用 C# 来获取它,这甚至是无关紧要的,因为您只是自动将其作为
String对象获取。而且,不要使用Encoding.Default,它不会像您认为的那样做。这并不意味着“ansi”。它的意思是“使用这台 PC 上碰巧配置的任何语言的本地编码”,如果你曾经在发生 not 的事情上运行它,这可能会非常错误设置为美式英语。 -
toEliteInput 是一个返回字符串的扩展方法。有没有办法准确地确定它的编码是什么?谢谢。
-
是的,但我正在尝试确定实际的 problem 是什么,这需要查看您的“错误”输出是什么。有几种方式可以破坏编码文本,修复它的方法取决于您实际得到的内容。你从来没有表现出来。我只是想要一个你从那个查询中得到的东西的例子。无论如何,this answer 在检测编码方面应该会帮助您。
-
我只是想在这里发帖,我们偶然发现第 3 方供应商告诉我们的内容是错误的。应用程序不接受 UTF-8 编码。它只需要普通的 ANSI,不需要扩展字符。所以真的没有办法让这些角色进入应用程序。这一切都是徒劳的。很抱歉浪费了您的时间,但感谢您的帮助。
标签: c# asp.net encoding utf-8 ansi