【问题标题】:Read ASCII and UNICODE chars from pipe to char[] in WIN1250 or as wchar_t[]将 ASCII 和 UNICODE 字符从管道读取到 WIN1250 中的 char[] 或作为 wchar_t[]
【发布时间】:2020-09-25 11:24:40
【问题描述】:

CreateProcess 一个子应用程序。执行后,我可以从附加到子进程外的管道中读取。我有一些代码可以阅读:

 char chBuf[BUFSIZE];
 DWORD dwRead;

 ReadFile( g_hChildStd_OUT_Rd, chBuf, BUFSIZE, &dwRead, NULL);

Ofc 这是没有任何安全检查等的简单代码。只有我的问题。当我阅读时,有些字符是正常的,就像普通的 ANSI 字符一样,但是当读取一些区域字符时,我认为这个字符是多字节的。请看屏幕。

如何将这种 ASCII 和 UNICODE 字符数组的混合转换为 WIN1250 中的字符数组,或者像 wchar_t[] 这样的 unicode 字符数组?

【问题讨论】:

  • 这看起来像 UTF-8,而不是“ASCII 和 Unicode 的混合体”。
  • 您将 bytes 推入管道,它们代表的内容取决于您。在这种情况下,它似乎是一个 utf8 编码的字符串。这很好,很常见的编码,但不要让它意外地好。它是 UNICODE,而不是 ASCII。如有必要,使用 MultibyteToWideChar() 和 CP_UTF8 进行转换。
  • 如何在 C++ Builder 中轻松地将这个数组转换为一些 UnicodeString?
  • @lgabryel 在 C++Builder 2009+ 中,将字节放入 UTF8String 并将其分配给 UnicodeString,RTL 将为您转换数据。在早期版本中,将字节放入AnsiString,将其传递给UTF8Decode(),并将结果分配给WideString

标签: c++ unicode pipe ascii readfile


【解决方案1】:

@Hans Passant 是对的。这是解决方案

 char chBuf[BUFSIZE];
 wchar_t wChBuf[BUFSIZE];
 DWORD dwRead;

 ReadFile( g_hChildStd_OUT_Rd, chBuf, BUFSIZE, &dwRead, NULL);
 MultiByteToWideChar( CP_UTF8, MB_PRECOMPOSED, chBuf, BUFSIZE, wChBuf, ARRAYSIZE(wChBuf));
 UnicodeString str = UnicodeString(wChBuf);

感谢您的帮助。

【讨论】:

  • 在调用MultiByteToWideChar() 时,您应该使用dwRead 而不是BUFSIZE。此外,此代码不能确保wChBuf 以空值结尾,因此您应该将MultiByteToWideChar() 的返回值传递给UnicodeString 构造函数。另外,请注意 UTF-8 使用多字节字符,ReadFile() 不会保证chBuf 的结尾不会落在不完整字符的字节序列中间(即,如果@ 中的最后一个字节对于字符序列0xC4 0x99,987654332@ 是0xC4),所以你也应该考虑到这一点。
猜你喜欢
  • 1970-01-01
  • 2011-11-12
  • 1970-01-01
  • 2014-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-02
  • 1970-01-01
相关资源
最近更新 更多