【问题标题】:printf not printing the same as fprintf [duplicate]printf 不打印与 fprintf 相同的内容 [重复]
【发布时间】:2017-01-14 19:22:46
【问题描述】:

我正在用 C 语言为一个项目制作一个程序,在该项目中,它将打印到控制台的所有内容都打印到文件中。问题是我必须打印一些特殊字符,如“Ç”,所以我使用 ascii 代码,它可以很好地打印到控制台,但是它打印到文件的内容不正确。这是一个例子:

printf(" %c", 128);

output to console: Ç

fprintf(output, " %c", 128);

output to file: €

我在 cmd 中运行了命令 chcp,它告诉我我正在使用代码页 850,并且我使用了那些 asci 代码,所以我不知道是什么问题。程序写入记事本txt文件。

【问题讨论】:

  • 检查编辑器使用的代码页
  • 注意128不是ASCII码; ASCII 只定义代码 0..127.
  • 您如何分析“输出到文件”?你用什么命令来显示文件的内容? CP850 在代码点 128 处有Ç; CP1252 在代码点 128 处有 €。这是对相同 8 位的两种不同解释。
  • 也许您需要告诉记事本使用 CP850 代码集而不是 CP1252 — 反之亦然。
  • 请注意这是未定义的行为。 %cchar 的格式说明符,但 128int

标签: c windows printf ascii special-characters


【解决方案1】:

Ç 在代码页 437 或 850 等中是 128,Windows 控制台有时使用的编码。相同的代码 128 是代码页 1252 或 1250 中的 ,这是 Windows 图形应用程序经常使用的编码。唯一合理的方法是让您的控制台使用与图形应用程序相同的编码;为此,您可以在命令提示符的控制台中使用命令chcp 1252 (change code page)。

(注意:要使chcp 生效,控制台必须使用TrueType 字体,例如Lucida Console 或Consolas。)

【讨论】:

  • 我使用了命令 chcp 1252,但它不起作用。是否必须重新启动系统或应用程序才能使更改生效?
  • 应该立即在控制台中服从。啊!我忘了,您必须将控制台字体设置为 TrueType 字体,例如 Lucida Console 或 Consolas。道歉。
  • 好的,谢谢您的帮助
【解决方案2】:

您的命令行(控制台)和用于显示文件的任何内容都使用不同的编码。 两次都写入字节128,但在some Extended ASCII variant(另见Wikipedia)中,它被解释为带有cedilla的C, 而a common Windows encoding 将其解释为欧元符号。

【讨论】:

    猜你喜欢
    • 2016-08-12
    • 2012-04-12
    • 2019-03-19
    • 1970-01-01
    • 1970-01-01
    • 2017-01-24
    • 2019-01-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多