Linux 下查看文件字符编码和转换编码
- 格式:pdf
- 大小:206.02 KB
- 文档页数:6
linux 中inode的编码格式Linux 中inode的编码格式在Linux操作系统中,inode(索引节点)是用于存储文件元数据的重要数据结构。
每个文件和目录在磁盘上都有一个唯一对应的inode,并且通过这个inode 可以定位和访问相应的文件或目录。
那么,在Linux中,inode是如何进行编码格式呢下面将逐步介绍:1. 文件系统首先需要了解的是,Linux支持多种不同类型的文件系统,如Ext2、Ext3、Ext4等。
每种类型的文件系统可能采用不同版本或扩展来实现自己独特的inode编码格式。
例如,Ext2使用32位整数作为inode号码,并且以二进制形式直接表示该号码;而Ext4则使用128位无符号整数作为inode号码,并通过十六进制字符串进行表示。
2. inode 数据结构无论采用何种类型和版本的文件系统,所有与inode 相关联信息均被保存在一个固定大小区域内。
这个区域包含了很多字段, 比如:- 文件大小:记录了该文件所占据空间大小;- 创建时间和修改时间:记录了该文件最后被创建或者修改时候真实发生时间;- 用户id 和组id:因为Linux 支持多用户模式, 所以需要针对各用户提供权限;- 挂载点: 记录了文件所在的位置;- 硬链接数量: 表示有多少个硬连接指向此inode;等针对inode 信息是一个岗位比较大的课题,这里不再展开。
3. 文件名与inode号码当我们创建一个新文件或目录时,系统会为其分配唯一的inode号码,并将该inode号码与相应的文件名进行映射,以便可以通过文件名来访问到具体的inode。
此映射关系一般保存在文件系统中的某个特定区域(如Ext2中称为目录项)。
4. 查找和访问通过前面步骤建立起来的(inode, 文件名) 映射以后, 在进行查找和访问时只需要首先定位到与名称相关联目录遍历(readir) , 到dirdata / aim_name_field.然后读取其中存储索引节点(即inode编号)。
Linux下如何将UTF8编码批量转换成GB2312编码UTF8编码和GB2312编码是有区别的,在sqlplus中导入UTF8编码的sql脚本就会出现乱码错误,这时就需要将UTF8编码转换成GB2312编码,可是一个个的转换十分麻烦,下面店铺就教你如何在Linux下将UTF8编码批量转换成GB2312编码。
背景本人在使用oracle的sqlplus批量导入UTF8编码的sql脚本时,由于不了解如何设置让sqlplus识别UTF8格式,导致出现乱码、错行等错误,而使工作无法继续,在google无果的情况下只好想办法转换编码。
由于文件较多,手动转换太麻烦,于是想到用脚本批量转换,幸好网上相关脚本比较多,实现起来唯一的麻烦是UTF8的BOM标记。
内容:代码如下:#!/bin/bashfor loop in `find 。
-type f -name “*.sql” -print`doecho $loopmv -f $loop $loop.tmpdos2unix $loop.tmpfile_check_utf8=‘file_check_utf8.log’sed -n ‘1l’ $loop.tmp 》$file_check_utf810. if grep ‘^\\357\\273\\277’ $file_check_utf8 》/dev/null 2》&111. thenecho ‘UTF-8 BOM’sed -n -e ‘1s/^.。
//’ -e ‘w intermediate.txt’ $loop.tmp14. iconv -f UTF-8 -t GB2312 -o $loop intermediate.txt15. rm -rf intermediate.txtrm -rf $loop.tmpelif iconv -f UTF-8 -t GB2312 $loop.tmp 》/dev/null 2》&118.thenecho ‘UTF-8’iconv -f UTF-8 -t GB2312 -o $loop $loop.tmp21. rm -rf $loop.tmpelseecho ‘ANSI’mv -f $loop.tmp $loopfirm -rf $file_check_utf8#模拟unix2dos,要求文本文件最后一行必须有换行符28. sed -n -e ‘s/$/\r/g’ -e ‘w ’$loop.tmp $loop29. mv -f $loop.tmp $loopdone#!/bin/bashfor loop in `find 。
Linux 下查看文件字符编码和转换编码如果你需要在Linux中操作windows下的文件,那么你可能会经常遇到文件编码转换的问题。
Windows中默认的文件格式是GBK(gb2312),而Linux一般都是UTF-8。
下面介绍一下,在Linux 中如何查看文件的编码及如何进行对文件进行编码转换。
一,查看文件编码:在Linux中查看文件编码可以通过以下几种方式:1.在Vim中可以直接查看文件编码:set fileencoding即可显示文件编码格式。
如果你只是想查看其它编码格式的文件或者想解决用Vim查看文件乱码的问题,那么你可以在~/.vimrc 文件中添加以下内容:set encoding=utf-8fileencodings=ucs-bom,utf-8,cp936这样,就可以让vim自动识别文件编码(可以自动识别UTF-8或者GBK 编码的文件),其实就是依照fileencodings提供的编码列表尝试,如果没有找到合适的编码,就用latin-1(ASCII)编码打开。
2. enca (如果你的系统中没有安装这个命令,可以用sudo yum install -y enca 安装)查看文件编码$ enca filenamefilename: Universal transformation format 8 bits; UTF-8CRLF line terminators需要说明一点的是,enca对某些GBK编码的文件识别的不是很好,识别时会出现:Unrecognized encoding二,文件编码转换1.在Vim中直接进行转换文件编码,比如将一个文件转换成utf-8格式:set fileencoding=utf-82.iconv 转换,iconv的命令格式如下:输入/输出格式规范:-f, --from-code=名称原始文本编码-t, --to-code=名称输出编码信息:-l, --list 列举所有已知的字符集输出控制:-c 从输出中忽略无效的字符-o, --output=FILE 输出文件-s, --silent 关闭警告--verbose 打印进度信息-?, --help 给出该系统求助列表--usage 给出简要的用法信息-V, --version 打印程序版本号例子:iconv -f utf-8 -t gb2312 aaa.txt >bbb.txt这个命令读取aaa.txt文件,从utf-8编码转换为gb2312编码,其输出定向到bbb.txt文件。
在LINUX上进行编码转换时,既可以利用iconv函数族编程实现,也可以利用iconv命令来实现,只不过后者是针对文件的,即将指定文件从一种编码转换为另一种编码。
一、利用iconv函数族进行编码转换iconv函数族的头文在LINUX上进行编码转换时,既可以利用iconv函数族编程实现,也可以利用iconv命令来实现,只不过后者是针对文件的,即将指定文件从一种编码转换为另一种编码。
一、利用iconv函数族进行编码转换iconv函数族的头文件是iconv.h,使用前需包含之。
#include <iconv.h>iconv函数族有三个函数,原型如下:(1) iconv_t iconv_open(const char *tocode, const char *fromcode);此函数说明将要进行哪两种编码的转换,tocode是目标编码,fromcode是原编码,该函数返回一个转换句柄,供以下两个函数使用。
(2) size_t iconv(iconv_t cd,char **inbuf,size_t *inbytesleft,char **outbuf,size_t *outbytesleft);此函数从inbuf中读取字符,转换后输出到outbuf中,inbytesleft用以记录还未转换的字符数,outbytesleft用以记录输出缓冲的剩余空间。
(3) int iconv_close(iconv_t cd);此函数用于关闭转换句柄,释放资源。
例子1: 用C语言实现的转换示例程序/* f.c : 代码转换示例C程序*/#include <iconv.h>#define OUTLEN 255main(){char *in_utf8 = "姝e?ㄥ??瑁?";char *in_gb2312 = "正在安装";char out[OUTLEN];//unicode码转为gb2312码rc = u2g(in_utf8,strlen(in_utf8),out,OUTLEN);printf("unicode-->gb2312 out=%sn",out);//gb2312码转为unicode码rc = g2u(in_gb2312,strlen(in_gb2312),out,OUTLEN);printf("gb2312-->unicode out=%sn",out);}//代码转换:从一种编码转为另一种编码int code_convert(char *from_charset,char *to_charset,char *inbuf,int inlen,char *outbuf,int outlen){iconv_t cd;int rc;char **pin = &inbuf;char **pout = &outbuf;cd = iconv_open(to_charset,from_charset);if (cd==0) return -1;memset(outbuf,0,outlen);if (iconv(cd,pin,&inlen,pout,&outlen)==-1) return -1;iconv_close(cd);return 0;}//UNICODE码转为GB2312码int u2g(char *inbuf,int inlen,char *outbuf,int outlen){return code_convert("utf-8","gb2312",inbuf,inlen,outbuf,outlen);//GB2312码转为UNICODE码int g2u(char *inbuf,size_t inlen,char *outbuf,size_t outlen){return code_convert("gb2312","utf-8",inbuf,inlen,outbuf,outlen); }例子2: 用C++语言实现的转换示例程序/* f.cpp : 代码转换示例C++程序*/#include <iconv.h>#include <iostream>#define OUTLEN 255using namespace std;// 代码转换操作类class CodeConverter {private:iconv_t cd;public:// 构造CodeConverter(const char *from_charset,const char *to_charset) { cd = iconv_open(to_charset,from_charset);}// 析构~CodeConverter() {iconv_close(cd);// 转换输出int convert(char *inbuf,int inlen,char *outbuf,int outlen) {char **pin = &inbuf;char **pout = &outbuf;memset(outbuf,0,outlen);return iconv(cd,pin,(size_t *)&inlen,pout,(size_t *)&outlen);}};int main(int argc, char **argv){char *in_utf8 = "姝e?ㄥ??瑁?";char *in_gb2312 = "正在安装";char out[OUTLEN];// utf-8-->gb2312CodeConverter cc = CodeConverter("utf-8","gb2312");cc.convert(in_utf8,strlen(in_utf8),out,OUTLEN);cout << "utf-8-->gb2312 in=" << in_utf8 << ",out=" << out << endl;// gb2312-->utf-8CodeConverter cc2 = CodeConverter("gb2312","utf-8");cc2.convert(in_gb2312,strlen(in_gb2312),out,OUTLEN);cout << "gb2312-->utf-8 in=" << in_gb2312 << ",out=" << out << endl; }linux C 字符集转换,UTF-8,GB2312最近帮朋友写个系统接口的小东东,2个系统字符集不同,一个采用UTF-8,一个采用GB2312,不得已需要转换字符集。
在Linux终端中查找和替换文本在Linux终端中,我们经常需要对文本进行查找和替换操作。
无论是在单个文件中还是在多个文件中,Linux提供了多种强大的命令和工具来满足这些需求。
本文将介绍一些常用的方法和工具,帮助您在Linux终端中高效地进行文本查找和替换。
一、查找文本1. grep命令grep命令是一个非常有用的文本搜索工具。
它可以在文件中查找指定的字符串,并显示包含该字符串的行。
以下是grep命令的基本语法:```bashgrep "要查找的字符串" 文件名```例如,要在一个名为example.txt的文件中查找包含关键词"hello"的行,可以使用以下命令:```bashgrep "hello" example.txt```grep命令还支持使用正则表达式进行更复杂的匹配,例如:```bashgrep "^[A-Za-z]" example.txt```该命令将匹配以字母开头的行。
2. find命令find命令可以帮助我们在指定目录及其子目录下查找文件。
如果您想要查找所有包含特定字符串的文件,并显示它们的路径,可以使用以下命令:```bashfind /path/to/directory -type f -exec grep -l "要查找的字符串" {} \;```例如,要在名为documents的目录及其子目录下查找包含字符串"important"的文件,可以使用以下命令:```bashfind documents/ -type f -exec grep -l "important" {} \;```该命令将列出所有包含关键词"important"的文件路径。
二、替换文本在Linux终端中,我们可以使用sed和awk这两个工具来实现文本的替换操作。
在Linux服务器上,中文路径的编码规则主要涉及到字符编码和文件系统。
以下是关于在Linux服务器上使用中文路径的一些重要注意事项:1. **字符编码**:- Linux系统通常使用UTF-8字符编码来处理文本数据,这也包括文件和目录名称。
- UTF-8是一种多字节编码,能够支持各种语言,包括中文。
- 确保你的终端和应用程序都使用UTF-8编码,以避免字符乱码问题。
2. **文件系统编码**:- 大多数Linux文件系统(如ext4、XFS等)支持UTF-8编码的文件和目录名称。
- 这意味着你可以创建和使用包含中文字符的文件和目录名称,只要操作系统和文件系统都正确配置了UTF-8编码。
3. **路径分隔符**:- 在Linux中,路径分隔符通常是斜杠(/),不像Windows中使用反斜杠(\)。
- 因此,一个典型的中文路径可能如下所示:`/home/用户/文档/中文文件夹/文件.txt`4. **注意文件名长度**:- 文件系统通常对文件名长度有一定的限制,这包括字符数和字节数。
不同文件系统的限制不同。
- 长文件名可能会导致问题,因此在创建中文文件名时要小心不要超出文件系统的限制。
5. **字符转义**:- 在命令行中,如果你需要在文件名中使用特殊字符或空格,可以使用字符转义或引号。
- 例如,如果你有一个文件名中包含空格的文件,可以使用反斜杠转义空格,或者将整个文件名用引号括起来:`文件\ 名字.txt` 或`"文件名字.txt"`总之,在Linux服务器上使用中文路径通常不是问题,前提是你正确设置字符编码,使用支持UTF-8的文件系统,避免超长文件名,以及在命令行中正确处理特殊字符和空格。
如果你在使用特定应用程序或脚本时遇到问题,请确保它们也正确支持中文路径。
Linux下查看文件编码,文件或文件名编码格式转换2011-08-07 21:18:40Windows中默认的文件格式是GBK(gb2312),而Linux一般都是UTF-8。
要想Linux正常显示中文,最后设置linux和windows都的编码方式都为UTF-8。
1. linux命令enca查看文件编码格式[root@local ~]# enca test.txtSimplified Chinese National Standard; GB2312该文件是windows下记事本编辑产生的文件,编码方式是GB23122. 设置linux系统支持UTF-8格式的中文显示[root@local ~]# vim /etc/sysconfig/i18nLANG="zh_CN.UTF-8"使i18n生效:[root@local ~]#source /etc/sysconfig/i18n生效后的结果:[root@local ~]#localeLANG=zh_CN.UTF-8LC_CTYPE="zh_CN.UTF-8"LC_NUMERIC="zh_CN.UTF-8"LC_TIME="zh_CN.UTF-8"LC_COLLATE="zh_CN.UTF-8"LC_MONETARY="zh_CN.UTF-8"LC_MESSAGES="zh_CN.UTF-8"LC_PAPER="zh_CN.UTF-8"LC_NAME="zh_CN.UTF-8"LC_ADDRESS="zh_CN.UTF-8"LC_TELEPHONE="zh_CN.UTF-8"LC_MEASUREMENT="zh_CN.UTF-8"LC_IDENTIFICATION="zh_CN.UTF-8"LC_ALL=3.文件编码转换[root@local ~]#iconv -f GB2312 -t UTF-8 test.txt -o test2.txt[root@local ~]#enconv -L GB2312 -x UTF-8 test.txt- 1 -然后就可以显示test2.txt的中文内容4.文件名编码转换convmv -f 源编码-t 新编码[选项] 文件名常用参数:-r 递归处理子文件夹–notest 真正进行操作,请注意在默认情况下是不对文件进行真实操作的,而只是试验。
linux查看16进制文件的方法
在Linux系统中,有多种方法可以查看16进制文件。
下面我将介绍其中的几种方法:
1. 使用hexdump命令:
```
hexdump -C file_name
```
上述命令将以16进制和ASCII码的形式显示文件内容。
每行显示16个字节,以16进制和ASCII码的形式交替显示文件内容。
2. 使用xxd命令:
```
xxd file_name
```
上述命令将以16进制格式显示文件内容。
每行显示16个字节,以16进制形式显示,同时在右侧显示对应的ASCII码。
3. 使用od命令:
```
od -t x1 -A n file_name
```
上述命令将以16进制格式显示文件内容。
每行显示16个字节,以16进制形式显示。
```
:%!xxd
```
这将将文件内容转换为16进制显示。
可以使用`:q`退出16进制显示模式。
```
M-x hexl-mode
```
6. 使用bless工具:
```
sudo apt-get install bless
```
安装完成后,可以使用以下命令启动bless:
```
bless file_name
```
文件内容将以16进制的形式显示在bless的界面中。
以上是几种在Linux中查看16进制文件的方法。
根据实际需求和个人偏好,选择其中一种方法即可完成相应操作。
Linux 下查看文件字符编码和转换编码
Linux公社()于2006年9月25日注册并开通网站,Linux现在已经成为一种广受关注和支持的一种操作系统,IDC是互联网数据中心,LinuxIDC就是关于Linux的数据中心。
提供包括Ubuntu,Fedora,SUSE技术,以及最新IT资讯等Linux专业类网站。
如果你需要在Linux中操作windows下的文件,那么你可能会经常遇到文件编码转换的问题。
Windows中默认的文件格式是GBK(gb2312),而Linux一般都是UTF-8。
下面介绍一下,在Linux中如何查看文件的编码及如何进行对文件进行编码转换。
一,查看文件编码:
在Linux中查看文件编码可以通过以下几种方式:
1.在Vim中可以直接查看文件编码
:set fileencoding
即可显示文件编码格式。
如果你只是想查看其它编码格式的文件或者想解决用Vim查看文件乱码的问题,那么你可以在
~/.vimrc 文件中添加以下内容:
set encoding=utf-8
fileencodings=ucs-bom,utf-8,cp936
这样,就可以让vim自动识别文件编码(可以自动识别UTF-8或者GBK 编码的文件),其实就是依照 fileencodings提供的编码列表尝试,如果没有找到合适的编码,就用latin-1(ASCII)编码打开。
2. enca (如果你的系统中没有安装这个命令,可以用sudo yum install -y enca 安装 )查看文件编码
$ enca filename
filename: Universal transformation format 8 bits; UTF-8 CRLF line terminators
需要说明一点的是,enca对某些GBK编码的文件识别的不是很好,识别时会出现:
Unrecognized encoding
二,文件编码转换
1.在Vim中直接进行转换文件编码,比如将一个文件转换成utf-8格式:set fileencoding=utf-8
2.iconv 转换,iconv的命令格式如下:
输入/输出格式规范:
-f, --from-code=名称原始文本编码
-t, --to-code=名称输出编码
信息:
-l, --list 列举所有已知的字符集
输出控制:
-c 从输出中忽略无效的字符
-o, --output=FILE 输出文件
-s, --silent 关闭警告
--verbose 打印进度信息
-?, --help 给出该系统求助列表
--usage 给出简要的用法信息
-V, --version 打印程序版本号
例子:
iconv -f utf-8 -t gb2312 aaa.txt >bbb.txt
这个命令读取aaa.txt文件,从utf-8编码转换为gb2312编码,其输出定向到bbb.txt文件。
iconv -f encoding -t encoding inputfile
比如将一个UTF-8 编码的文件转换成GBK编码
iconv -f GBK -t UTF-8 file1 -o file2
3. enconv 转换文件编码
比如要将一个GBK编码的文件转换成UTF-8编码,操作如下
enconv -L zh_CN -x UTF-8 filename
三,文件名编码转换:
从Linux往 windows拷贝文件或者从windows往Linux拷贝文件,有时会出现中文文件名乱码的情况,出现这种问题的原因是因为,windows的文件名 中文编码默认为GBK,而Linux中默认文件名编码为UTF8,由于编码不一致,所以导致了文件名乱码的问题,解决这个问题需要对文件名进行转码。
在Linux中专门提供了一种工具convmv进行文件名编码的转换,可以将文件名从GBK转换成UTF-8编码,或者从UTF-8转换到GBK。
首先看一下你的系统上是否安装了convmv,如果没安装的话用: yum -y install convmv 安装。
下面看一下convmv的具体用法:
例如
convmv -f GBK -t UTF-8 *.mp3
不过这个命令不会直正的转换,你可以看到转换前后的对比。
如果要直正的转换要加上参数 --notest
convmv -f GBK -t UTF-8 --notest *.mp3
-f 参数是指出转换前的编码,-t 是转换后的编码。
这个千万不要弄错了。
不然可能还是乱码哦。
还有一个参数很有用。
就是 -r 这个表示递归转换当前目录下的所有子目录。
convmv -f 源编码 -t 新编码 [选项] 文件名
常用参数:
-r 递归处理子文件夹
–notest 真正进行操作,请注意在默认情况下是不对文件进行真实操作的,而只是试验。
–list 显示所有支持的编码
–unescap 可以做一下转义,比如把%20变成空格
比如我们有一个utf8编码的文件名,转换成GBK编码,命令如下:convmv -f UTF-8 -t GBK –notest utf8编码的文件名
这样转换以后”utf8编码的文件名”会被转换成GBK编码(只是文件名编码的转换,文件内容不会发生变化)
四,vim 编码方式的设置
和所有的流行文本编辑器一样,Vim 可以很好的编辑各种字符编码的文件,这当然包括UCS-2、UTF-8 等流行的Unicode 编码方式。
然而不幸的是,和很多来自 Linux 世界的软件一样,这需要你自己动手设置。
Vim 有四个跟字符编码方式有关的选项,encoding、fileencoding、fileencodings、termencoding (这些选项可能的取值请参考 Vim 在线帮助 :help encoding-names),它们的意义如下:
* encoding: Vim 内部使用的字符编码方式,包括 Vim 的 buffer (缓冲区)、菜单文本、消息文本等。
默认是根据你的locale选择.用
户手册上建议只在 .vimrc 中改变它的值,事实上似乎也只有在.vimrc 中改变它的值才有意义。
你可以用另外一种编码来编辑和保存文件,如你的vim的encoding为utf-8,所编辑的文件采用cp936编码,vim会 自动将读入的文件转成utf-8(vim的能读懂的方式),而当你写入文件时,又会自动转回成cp936(文件的保存编码).
* fileencoding: Vim 中当前编辑的文件的字符编码方式,Vim 保存文件时也会将文件保存为这种字符编码方式 (不管是否新文件都如此)。
* fileencodings: Vim自动探测fileencoding的顺序列表,启动时会按照它所列出的字符编码方式逐一探测即将打开的文件的字符编码方式,并且将 fileencoding 设置为最终探测到的字符编码方式。
因此最好将Unicode 编码方式放到这个列表的最前面,将拉丁语系编码方式 latin1 放到最后面。
* termencoding: Vim 所工作的终端 (或者 Windows 的 Console 窗口) 的字符编码方式。
如果vim所在的term与vim编码相同,则无需设置。
如其不然,你可以用vim的termencoding选项将自动转换成term 的编码.这个选项在 Windows 下对我们常用的 GUI 模式的 gVim 无效,而对 Console 模式的Vim 而言就是 Windows 控制台的代码页,并且通常我们不需要改变它。
五,Vim 的多字符编码工作方式
1. Vim 启动,根据 .vimrc 中设置的 encoding 的值来设置 buffer、菜单文本、消息文的字符编码方式。
2. 读取需要编辑的文件,根据 fileencodings 中列出的字符编码方式逐一探测该文件编码方式。
并设置 fileencoding 为探测到的,看起来是正确的 (注1) 字符编码方式。
3. 对比 fileencoding 和 encoding 的值,若不同则调用 iconv 将文件内容转换为encoding 所描述的字符编码方式,并且把转换后的内容放到为此文件开辟的 buffer 里,此时我们就可以开始编辑这个文件了。
注意,完成这一步动作需要调用外部的 iconv.dll(注2),你需要保证这个文件存在于 $VIMRUNTIME 或者其他列在 PATH 环境变量中的目录里。
4. 编辑完成后保存文件时,再次对比 fileencoding 和 encoding 的值。
若不同,再次调用 iconv 将即将保存的 buffer 中的文本转换为 fileencoding 所描述的字符编码方式,并保存到指定的文件中。
同样,这需要调用 iconv.dll由于 Unicode 能够包含几乎所有的语言的字符,而且 Unicode 的 UTF-8 编码方式又是非常具有性价比的编码方式 (空间消耗比 UCS-2 小),因此建议 encoding 的值设置为utf-8。
这么做的另一个理由是 encoding 设置为 utf-8 时,Vim 自动探测文件的编码方式会更准确 (或许这个理由才是主要的 。
我们在中文 Windows 里编辑的文件,为了兼顾与其他软件的兼容性,文件编码还是设置为 GB2312/GBK 比较合适,因此 fileencoding 建议设置为 chinese (chinese 是个别名,在 Unix 里表示 gb2312,在 Windows 里表示cp936,也就是 GBK 的代码页)。