Windows 上的 GnuPlot“第 1 行的错误数据”(编辑:PowerShell 编码)

问题描述 投票:0回答:3

背景:

GnuPlot 无法读取编译的 C 代码生成的数据(在 Windows 10 电脑上)。

编辑: 实际问题是 Windows PowerShell 环境强制执行的字符编码。

详情:

这是我的(大大简化用于测试)数据文件“data1”

0.0000e+00 0.0000e+00
5.0000e-01 2.5000e-01

这是由

制作的
#include <stdio.h>
void main()
{
    double x=0.0 , y=0.0;
    printf("%.4e %.4e\n",x,y);
    x=0.5; y=x*x;
    printf("%.4e %.4e\n",x,y);
}

在 Visual Studio Code 1.84.2(使用 gcc 的 MSYS2 版本 12.2.0)上编译成我称之为“SPAM”的可执行文件。在 Windows power shell 的该目录中,我调用

.\SPAM > data1

编辑: 罪魁祸首是 Windows PowerShell,它通过重定向字符 > 将输出编码为 UTF-16 LE BOM。

使用 GnuPlot 5.4(补丁级别 8)给我带来了这个麻烦:

gnuplot> plot 'data1'
              ^
         Bad data on line 1 of file data1

尝试:

直接使用

plot '-'
输入这些数据效果很好。 使用Notepad++查看数据文件没有显示隐藏或特殊字符。 将数据文件的内容复制粘贴到新文件中即可解决问题! 但我不能复制我的所有(实际上巨大)数据文件。

问题:

    GnuPlot 不喜欢的数据文件中隐藏了什么?
  1. 我可以通过更改 GnuPlot 中的设置/标志来解决这个问题吗?
  2. 我的 VSC 和 gcc 安装/构建是否有问题,会生成“奇怪”的文件?

编辑: 实际问题不是这些——而是 Windows PowerShell 强制执行的编码。

powershell character-encoding
3个回答
1
投票
在我的 Windows 10 上,Powershell 生成一个 UTF-16 编码的 data1 文件,大小为 94 字节。

“普通”命令 shell

cmd.exe

 生成大小为 46 字节的 ASCII 文本。

因此我建议使用

cmd.exe

而不是Powershell来运行命令
.\SPAM > data1
。或者编写运行此命令的批处理脚本,可以从 Powershell 运行批处理脚本。

更新:

根据

这个超级用户答案,您还可以从Powershell运行此命令:

.\SPAM | Out-File -Encoding ascii data1


如果您想更深入地了解,您可能需要搜索“printf powershell 生成 UTF-16”之类的内容。


1
投票
不确定这是否是解决方案,但@helper的评论可能是一个提示。较新版本的 gnuplot(您有 5.4.8)绝对可以读取 ANSI 和 UTF-8 编码的文本文件,但不是它们的所有变体。

当我在 Notepadd++ 中转换文件的编码时,我可以重现您的错误消息,例如从 UTF-8 到 UTF-8-BOM。鼠标右键单击状态行中的编码。

那么,您的 Notepad++ 在文件状态行右侧显示的编码是什么?

如果您的 C 代码默认生成 UTF-8-BOM 或 UTF-16 或其他一些字符,您需要在 C 程序中更改它。


1
投票
我列出的帖子:

https://unix.stackexchange.com/questions/171832/converting-a-utf-8-file-to-ascii-best-effort

建议通过 iconv 传输数据:

.\SPAM | iconv -c -f utf-8 -t ascii//TRANSLIT > data1
或者,我从你的评论中认为:

.\SPAM | iconv -c -f UTF-16LE -t ascii//TRANSLIT > data1
如果您的系统上存在 iconv,那么这应该可以工作。 -c 丢弃无法用 ASCII 表示的字符。

我刚刚注意到,如果你在 Win 10 中通过 TYPE 传输数据,它似乎会转换为 ASCII:

.\SPAM >data0 TYPE data0 >data1
简单,如果可行的话。

© www.soinside.com 2019 - 2024. All rights reserved.