不同编辑器换行不同导致的显示问题

摘要

windows换行符:\r\n

unix:\n

仅仅因为这个小小的不同,文件在多个系统环境下编辑过后,可能会发现文件的显示除了问题。最糟糕的是同一份文件里面既有windows的\r\rn风格的换行,又有unix的\n风格的换行。用vim打开这样一份混合换行风格的文件,会现多余的^M符号(不影响编译,但是很难看)。

问题

在不同系统下使用不同的文本编辑器边界源代码的时候,各编辑器可能会使用一些不同的标准,导致的结果是A编辑器编辑过的文件,在B编辑器里面显示异常。如下图所示,

显示异常的源文件

这份源文件最初版本是使用vim创建的,中途使用了Notepad++编辑过后,再拿到vim下发现文件各行行尾出现了异常字符^M

分析

将问题源文件test.c拷贝一份,生成一个正常显示的test-copy.c文件。

正常显示的源文件

使用hexdump命令查看两份文件,逐字节的比较异同

#hexdump -c -n 100 test.c

hexdump of test.c

#hexdump -c -n 100 test-copy.c

hexdump of test-copy.c

上图蓝色线表示了问题的所在。

文件中的换行应该由连续的两个字符\r\n表示,而不是一个\n


修复

修复思路:以二进制形式打开文件,逐字节读取,如果读到\n,那么检查前一个字符,如果前一个字符不是\r,那么插入一个\r

/* Usage: command filename */
#include <stdio.h>
#include <string.h>

int main(int argc, char **argv)
{
	FILE *fin, *fout;
	char fn[256];
	unsigned char c;
	int r;
	int lastChar = 0;
	
	if (argc <= 1) {
		printf("Usage: command filename.\n");
		return 0;
	}

	fin = fopen(argv[1], "rb");

	strcpy(fn, argv[1]);
	strcat(fn, ".tmp");

	fout = fopen(fn, "wb");

	while (!feof(fin)) {
		if (fread(&c, sizeof(char), 1, fin) != 1)
			break;

		if (c == '\n') {
			if (lastChar != '\r') {
				char p = '\r';
				fwrite(&p, sizeof(char), 1, fout);
			}
		}
		fwrite(&c, sizeof(char), 1, fout);

		lastChar = c;
	}

	fclose(fin);
	fclose(fout);

	{
		char cmd[256] = "";

		strcpy(cmd, "mv ");
		strcat(cmd, fn);
		strcat(cmd, " ");
		strcat(cmd, argv[1]);

		system(cmd);
	}

	return 0;
}


结果

以之前遇到的几个显示异常的源文件为用例,利用上面给出的程序,可以修复编辑器换行不一致,导致产生额外的'^M'字符的问题。


补记:

2013/03/19

其实,随linux系统发布的程序库里面有命令unix2dos/dos2unix专门处理此类问题,且实现的功能更完善。unix2dos代码是开源的,有兴趣可以下载来看看。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在 Markdown 表格中,不能使用换行符来换行。如果您希望在表格中的单元格内换行,可以使用 HTML 语法 `<br>`。例如: ``` | 列 1 | 列 2 | |------|------| | 这是第一列 | 这是第二列<br>换行了 | ``` 这样,在第二列中就可以实现换行效果。注意,使用 HTML 语法时,需要在表格前加上 `<html>` 和 `</html>` 标签。 另外,如果您希望在 Markdown 表格中自动换行,可以使用 `<div>` 标签,例如: ``` | 列 1 | 列 2 | |------|------| | 这是第一列 | <div style="word-wrap: break-word;">这是第二列,内容很长,自动换行了</div> | ``` 这样就可以在表格中自动换行了。 总之,在 Markdown 表格中换行的方法有两种: - 使用 HTML 语法 `<br>`。 - 使用 `<div>` 标签,并设置 `word-wrap: break-word`。 希望这些信息能帮到您。 ### 回答2: Markdown表格默认情况下不能换行。在Markdown语法中,表格的每一行都是一个独立的行,每个单元格之间使用竖线(|)进行分隔。当表格中的文字过长超出单元格宽度时,并不能自动换行,而是会将文字截断。 不过,在某些Markdown编辑器中,可以使用HTML标签来实现表格的换行。可以在单元格内使用`<br>`标签或者CSS样式来调整单元格的宽度,使得文字在超出单元格宽度时自动换行。 例如,在以下Markdown表格中,如果我们在单元格内部插入`<br>`标签: ``` | 编号 | 姓名 | 电子邮箱 | | --- | ------------ | -------------------------- | | 1 | 张三<br>李四 | zhangsan@example.com | | 2 | 王五 | wangwu@example.com | ``` 那么,当表格渲染时,姓名单元格中的文字将会自动换行显示为“张三”在上一行,“李四”在下一行。 需要注意的是,Markdown语法的表格本身是比较简单的,如果想要更复杂的表格,例如合并单元格等,通常需要使用其他格式(如CSV、HTML等)或使用Markdown支持此类功能的扩展。 ### 回答3: Markdown表格是一种用于展示数据的方式,通常不会自动换行。在Markdown中,表格的每一行由竖线(|)和破折号(-)组成,并且需要在表格上方使用冒号(:)来指定对齐方式。 例如,以下是一个简单的Markdown表格: |姓名|年龄|性别| |:---:|:---:|:---:| |张三|20|男| |李四|25|女| |王五|22|男| 在上述表格中,冒号的位置告诉Markdown如何对齐文本。冒号可以放在左侧、右侧或两侧,分别表示左对齐、右对齐和居中对齐。 如果表格内容较长,导致一行无法容纳,可以使用水平滚动条来查看整个表格,或者手动调整列宽度以适应内容。 也可以在表格中使用换行符(\n)来换行,但是由于Markdown的解析规则,换行后的文本不会被自动识别为新的表格行,而是解析为同一单元格的换行。因此,在正常情况下,Markdown表格中的文本应该被控制在一行内,以确保清晰的展示数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值