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
相关产品推荐
相关产品推荐

