免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4303 | 回复: 0
打印 上一主题 下一主题

[系统管理] 使用vim批量更新文件编码格式 [复制链接]

论坛徽章:
2
金牛座
日期:2014-05-24 15:42:55亥猪
日期:2014-08-12 15:00:33
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-07-24 14:22 |只看该作者 |倒序浏览
因为项目要求所有的源代码都需要转换成utf-8的格式,便于代码的查看和编辑。这的确是一种好的习惯,不然的话,使用SecureCRT查看日志的时候,因为源码编码格式的不同,写出来的日志有的是乱码,有的正常,如果想查看乱码对应的汉字的话,还得修改一下SecureCRT对应的编码格式,很是麻烦。

但是,如果大量的源码都要修改成utf-8格式的话,也不是一件容易的事情。于是乎,出现了下面的方法:
1、使用UE
文件——转换——ASCII 转 UTF-8      #文件编码格式转换为utf-8
文件——转换——DOS 转 UNIX         #转换为UNIX下的文件格式,也就是解决从windows下移动的文件到UNIX下,行末尾出现“^M”

转换一个文件格式的话,还是可以接受的,倘若我要转换抖个文件,这得单击多少次鼠标啊?!!!

2、使用iconv
使用iconv可以转换文件格式,但是,我却不怎么喜欢用(可能我还没有找到更好的参数把?如果知道如何更有效的使用iconv的话,多谢分享,谢谢)
例如
[billing_dx@bmcs1 temp]$file Task.cpp
Task.cpp: ISO-8859 C program text

[billing_dx@bmcs1 temp]$iconv -f ISO-8859 -t utf-8 Task.cpp -o Task.cpp.bak   
iconv: conversion from `ISO-8859' is not supported
Try `iconv --help' or `iconv --usage' for more information.
[billing_dx@bmcs1 temp]$
[billing_dx@bmcs1 temp]$iconv -f gbk -t utf-8 Task.cpp -o Task.cpp.bak
[billing_dx@bmcs1 temp]$file Task.cpp*
Task.cpp:     ISO-8859 C program text
Task.cpp.bak: UTF-8 Unicode C program text

我有些想不明白,命名使用“file”查看的文件格式是“ISO-8859”,转换的时候为什么却要用“gbk”呢(文件编码格式方面的知识,我不是太理解)?
而且,转换时,如果指定的转换前的编码格式书写错误的话,可能会转换成空文件,如果直接在原来的文件上修改话,好了,文件内容丢了。

所以,我感觉iconv的方式转换的话,还是比较麻烦,而且不安全。

3、vim的方式
使用vim打开文件之后,使用“:set fileencoding=utf-8”,就可以很容易的转换文件格式为“utf-8”,而且不用关注它原来的编码格式。而使用“set fileformat=unix”可以设置文件格式为UNIX下的。
但是,也遇到了一个问题,就是每次转换的时候,都要打开文件,然后保存退出。所以我一直在想,vim能不能实现非交互式的呢?

然后,昨天,同事告诉了我一个可行的方法,于是修改文件编码格式就可以使用下面的方法了:

vi +":set fileencoding=utf-8" +":set fileformat=unix" +":wq" 文件名

注:下面是man手册中对于vim执行命令的解释
+{command}                                              *-+c* *-c*     
-c {command}    在读入第一个文件后执行命令 {command} (在自动命令和文件的模式行
                处理之后)。"command" 按 Ex 命令来解释。如果 "command" 包含空
                格,应该用双引号括起该命令 (取决于使用的外壳)。
                示例: >
                        vim  "+set si"  main.c
                        vim  "+find stdio.h"
                        vim  -c "set ff=dos"  -c wq  mine.mak
<            
                注意: 在一个 Vim 命令里,你可以使用不超过 10 个 "+" 或者 "-c"
                参数。它们的执行按给定的顺序进行。"-S" 参数也被当作 "-c" 参数
                那样对待。
                {Vi 只允许一个命令}                     

也就是说,我们不但可以使用使用“+”使用命令,而且可以使用“-c”参数。
vi -c ":set fileencoding=utf-8" -c ":wq" 文件名

一旦可以实现非交互的vim,那就可以下一个脚本实现对于文件编码格式的转换,下面是我简单的写一个,用起来还不错,如下:

  1. #!/bin/bash
  2. # @file             utf-8.sh
  3. # @author       ymm
  4. # @brief          修改当前目录下的.cpp .c .h文件的编码格式为utf-8
  5. # @date          2014-07-23
  6. # @History
  7. # 1、2014-07-23  author ymm    初步完成
  8. for i in $(ls *.cpp *.c *.h)
  9. do
  10. echo "begin to modify the fileencoding of $i to utf-8"
  11. vi +":set fileencoding=utf-8" +":set fileformat=unix" +":wq" $i
  12. done
复制代码
唯一的遗憾,就是每次使用vim之后标准输出都会出现大部分的空白,如果vim中有一个参数,像gdb中的-q(不会输出介绍和版权信息,也就是类似于静默模式),那就更不错了。

不过,这样暂时够我使用了,在目录下执行该脚本,就可以把该目录下的所有“.cpp .c .h”文件的编码格式转换成utf-8并且是UNIX格式了。

希望大家提出改善意见,也希望对大家有所帮助。多谢!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP