You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Windows平台Unicode字符跨进程读写异常问题排查

跨进程Unicode标准输入输出异常问题解决

问题根源

C#进程重定向标准输入时,默认使用系统ANSI编码写入流,而C++的wcin(或cin)无法正确解析非ANSI Unicode字符——前者期望UTF-16编码输入,后者依赖ANSI编码无法覆盖所有Unicode字符范围,最终导致读取内容异常。

修正方案

1. C#端:指定标准输入编码为UTF-16

修改ProcessStartInfo,显式设置输入编码为Windows原生Unicode编码(UTF-16LE),确保写入的Unicode字符能被C++端正确识别:

static void Main(string[] args)
{
    var process = new Process();

    process.StartInfo.FileName = "C:\\...\\readinput.exe";
    process.StartInfo.UseShellExecute = false;
    process.StartInfo.RedirectStandardInput = true;
    // 设置输入编码为UTF-16,匹配C++ wchar_t的编码格式
    process.StartInfo.StandardInputEncoding = System.Text.Encoding.Unicode;

    process.Start();
    process.StandardInput.WriteLine("Hello from \u03A6\u0429\u3427");

    process.WaitForExit();
}

2. C++端:配置控制台输入代码页为UTF-16

调用Windows API设置控制台输入代码页为UTF-16,确保标准输入流正确解析UTF-16编码内容:

#include <windows.h>
#include <string>
#include <iostream>

int wmain()
{
    // 设置控制台输入代码页为UTF-16
    SetConsoleCP(CP_UTF16);
    std::wstring temp;
    std::getline(std::wcin, temp);

    // 调试用:查看内存中的字符串表示
    uint8_t* p = (uint8_t*)temp.data();
    return 0;
}

原理说明

  • Windows系统中,wchar_t采用UTF-16编码存储字符,C#的Encoding.Unicode会以UTF-16LE格式写入标准输入流,和C++的字符存储格式完全匹配。
  • SetConsoleCP(CP_UTF16)会告诉C++标准库,输入流的编码是UTF-16,wcin就能正确读取流中的Unicode字符,即使输入是跨进程重定向的也能生效。

内容的提问来源于stack exchange,提问作者AndreiM

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 12:05:11