【问题标题】:How to write non-ascii from stdin to file properly如何将非 ascii 从标准输入正确写入文件
【发布时间】:2019-04-01 20:57:26
【问题描述】:
#include <stdio.h>
#include <windows.h>


int main(int argc, char** argv)
{
    DWORD bytes_read;
    char buffer[65536];
    LPSTR str;

    ReadFile(GetStdHandle(STD_INPUT_HANDLE), buffer, 65536, &bytes_read, NULL);
    str = malloc(bytes_read);
    memcpy(str, buffer, bytes_read);

    FILE *f = fopen("file.txt", "w");
    fprintf(f, "stdin: %s", str);
    fprintf(f, "hardcoded: %s\n", "á");
    fclose(f);

    return 0;
}

通过echo á|.\Program.exe在powershell中运行时,file.txt的内容为:

stdin: ? ýýýýhardcoded: á

我有兴趣用从标准输入检索到的正确字符替换问号

【问题讨论】:

  • 你有更简单的例子吗?仅仅运行你的程序应该也能正常工作。重定向似乎只是混淆了问题。
  • 您的字符串不是以空值结尾的。您需要malloc(bytes_read+1),然后您需要确保buffer[bytes_read] 中有一个终止空值。
  • 您正在读取文件,就像它是二进制数据一样,但打印它就像它是一个以空字符结尾的字符串。
  • 1.我没有更简单的例子。 2. 我知道 ýýýý 是因为缺少空终止,但这不是这个问题的目标。我对第一个字符感兴趣
  • 您正在导致未定义的行为。发生的任何事情都不会让您感到惊讶。修复明显的错误,然后重试。

标签: c windows stdin utf


【解决方案1】:

Stdin 显然使用的是 CP437 字符集。使用此编码重新加载文件显示正确的字符

【讨论】:

    猜你喜欢
    • 2012-06-01
    • 2013-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-20
    • 2018-03-01
    • 2012-06-12
    • 1970-01-01
    相关资源
    最近更新 更多