- 此问题在此处已有答案**:
Special characters problems using Python unicode(4个答案)
2小时前关门了。
尽管这个问题与其他一些问题类似,但它们描述的是问题和解决方案,使用Python。这个问题对其他用户仍然很有价值,因为你**得到的是一个适用于C#**的解决方案。根本原因是相同的:Windows控制台默认使用代码页437作为stdout。然而,特别是C#和/或Python的初学者可能无法根据Python示例找出C#的解决方案。至少可以说,用Python重写整个C#应用程序来修复问题是不可取的。
我可以成功地将代码页1252中的旧C文件"file"转换为UTF-8:
var file = @"..." // input file
var tmp = @"...\tmp.c" // output file
var lines = File.ReadAllLines(file, Encoding.GetEncoding(1252));
File.WriteAllLines(tmp, lines, Encoding.UTF8);
当我从命令行调用tmp. c上的C预处理程序时(VisualStudio|工具|命令行):cl /utf-8 /C /EP tmp.c > tmp.c.i2
我得到了一个完全有效的UTF-8文件,名为"tmp.c.i2"。
然而,当我尝试在C#代码中执行此操作时(如下所示),出现了"£"(井号)和"·"(项目符号)等字符的错误。
// call preprocessor
var proc = new Process
{
StartInfo =
{
//EnableRaisingEvents = true,
FileName = @"C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\VC\Tools\MSVC\14.29.30133\bin\Hostx86\x86\cl.exe",
WorkingDirectory = work,
Arguments = "/utf-8 /C /EP tmp.c",
//FI<file> force include
CreateNoWindow = true,
UseShellExecute = false,
RedirectStandardOutput = true,
RedirectStandardError = false
}
};
proc.Start();
string output = proc.StandardOutput.ReadToEnd();
proc.WaitForExit();
File.WriteAllText(Path.Combine(formatted, "tmp.c.i"), output, Encoding.UTF8);
根据记事本++与十六进制编辑器插件
- 磅符号"£"(c2 a3)变为""(e2 94 ac c3 ba)
- 项目符号"·"(e2 80 a2 09)变为"Çó"(c3 94 c3 87 c3 b3)
我该怎么补救呢?
1条答案
按热度按时间dgsult0t1#
多亏了一个匿名社区成员的私人消息,我才能解决这个问题。我在
StartInfo
中添加了StandardOutputEncoding = Encoding.UTF8
。stdout的默认编码是code page 437。