.net 从C#调用C预处理器时,UTF-8输入文件(作为参数提供)的某些字符损坏[重复]

ccgok5k5  于 2022-12-30  发布在  .NET
关注(0)|答案(1)|浏览(99)
    • 此问题在此处已有答案**:

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)

我该怎么补救呢?

dgsult0t

dgsult0t1#

多亏了一个匿名社区成员的私人消息,我才能解决这个问题。我在StartInfo中添加了StandardOutputEncoding = Encoding.UTF8。stdout的默认编码是code page 437

相关问题