linux下經常遇到的編碼問題
如果你需要在中操作windows下的文件,那麼你可能會經常遇到文件編碼轉換的問題。Windows中默認的文件格式是GBK(gb2312),而Linux一般都是UTF-8。
查看編碼的方法
方法一:file filename
方法二:在Vim中可以直接查看文件編碼
:set fileencoding
如果你只是想查看其它編碼格式的文件或者想解決用Vim查看文件亂碼的問題,那麼你可以在
~/.vimrc 文件中添加以下內容:
set encoding=utf-8 fileencodings=ucs-bom,utf-8,cp936
這樣,就可以讓vim自動識別文件編碼(可以自動識別UTF-8或者GBK編碼的文件),其實就是依照fileencodings提供的編碼列表嘗試,如果沒有找到合適的編碼,就用latin-1(ASCII)編碼打開
文件編碼轉換
多平台方法:
iconv 提供標準的程序和API來進行編碼轉換;
convert_encoding.py 基於Python的文本文件轉換工具;
decodeh.py 提供演算法和模塊來談測字元的編碼;
linux下文件編碼轉換:
方法一:
在Vim中直接進行轉換文件編碼,比如將一個文件轉換成utf-8格式
:set fileencoding=utf-8
或者
11)設置文件集合,即要對哪些文件進行操作,可以使用通配符,比如我通常是對 C/C++ 源程序進行編碼轉換
:args *.h *.cpp
2)給出要在每個文件上執行的命令,這里是轉換編碼:
:argdo set fenc=utf-8 | update
方法二:
iconv 轉換
5.案例:
假如說我們將windows下的一個UTF-8的文件傳到linux環境下,linux環境下的系統編碼是GB18030,我們cat的時候就會出現亂碼,這個時候就應該想到轉碼了,下面我們來進行試驗:
我們將windows下一個名為UTF-8.sh的文件傳到linux系統中,其中UTF-8.sh的內容如下:
我是中文編碼UTF-8模式~
而linux系統的系統語言設置為:
[root@sor-sys zy]# cat /etc/sysconfig/i18n
LANG=zh_CN.GB18030
SYSFONT="latarcyrheb-sun16"
這個時候查看一下文件的內容及編碼:
[root@sor-sys zy]# file UTF-8.sh
UTF-8.sh: UTF-8 Unicode text, with no line terminators
[root@sor-sys zy]# cat UTF-8.sh
鍩挎垜鏄?腑鏂囩紪鐮乁TF-8妯″紡~[root@sor-sys zy]#
[root@sor-sys zy]#
這個時候我們就需要轉換編碼了,記得使用iconv
[root@sor-sys zy]# iconv -f UTF-8 -t GB18030 UTF-8.sh -o GB18030.sh
[root@sor-sys zy]# cat GB18030.sh
??我是中文編碼UTF-8模式~[root@sor-sys zy]#
[root@sor-sys zy]# file GB18030.sh
GB18030.sh: Non-ISO extended-ASCII text, with no line terminators
[root@sor-sys zy]#
convmv就是更改文件名編碼方式的一個工具。
比如
sudo convmv -f gbk -t utf-8 -r –notest /home
就是將/home目錄下原來文件名是gbk編碼方式的全部改為utf-8格式的。這里 -f 後面為原來的編碼方式,-t 後面是要更改為的編碼方式, -r 表示這個目錄下面的所有文件, –notest 表示馬上執行,而不是僅僅測試而已。另外這命令好像要root才能執行,因此要加上 sudo。
② Linux系統shell工具列印輸出
Linux系統shell工具列印輸出
shell腳本都是以#!/bin/bash開頭;這是固定的寫法,其中/bin/bash是bash命令的路徑。那麼Linux系統shell工具如何列印輸出呢?跟我一起來看看吧!
一般都會通過chmod授予shell腳本的可執行許可權。
在shell腳本中的列印輸出通常會有echo和printf兩種,前者會自動換行。
在shell中如果用雙引號("")作為列印輸出的內容時,如果雙引號中有特殊字元需要在特殊字元前加上轉義字元,當然也可以使用單引號或者不使用引號直接輸出,使用單引號或者不使用就不需要用到轉義字元。
格式替代符
有一些常用的格式替代符會經常在列印輸出中被用到,格式替代符只能用在printf輸出中。
%-5s:表示5個字元寬度,其中的-表示左對齊
%-4.2f:其中的f表示浮點型,4.2代表長度為4個字元且小數點2位,如果小數點超過2會進行四捨五入,-表示左對齊。
整形:
%d:整數的參數會被轉成一有符號的十進制數字
%u:整數的參數會被轉成一無符號的十進制數字
%o:整數的參數會被轉成一無符號的八進制數字
%x:整數的參數會被轉成一無符號的十六進制數字,並以小寫abcdef表示
%X:整數的參數會被轉成一無符號的十六進制數字,並以大寫ABCDEF表示
浮點型數:
%fdouble型的參數會被轉成十進制數字,默認取小數點以下六位,四捨五入
%edouble型的參數以指數形式列印,有一個數字會在小數點前,六位數字在小數點後,而在指數部分會以小寫的e來表示.
%E與%e作用相同,唯一區別是指數部分將以大寫的'E來表示.
%gdouble型的參數會自動選擇以%f或%e的格式來列印,其標準是根據欲列印的數值及所設置的有效位數來決定.
%G與%g作用相同,唯一區別在以指數形態列印時會選擇%E格式.
字元及字元串:
%c讀字元串的第一個字元
%s輸出指定寬度的字元內容.
%p如果是參數是"void*"型指針則使用十六進制格式顯示
列印輸出
在寫腳本的時候更多的會使用echo作為列印輸出,且習慣性的會使用雙引號。
echo
[root@localhosttmp]#echo"helloword"
helloword
printf
默認printf是不換行的
[root@localhosttmp]#printf"helloword"
helloword[root@localhosttmp]#
需要換行加上 參數
[root@localhosttmp]#printf"helloword "
helloword
[root@localhosttmp]#
編寫shell腳本
vimscrip.sh
#!/bin/bash
printf"%-5s%-10s%-4s "NoNameMark;
printf"%-5s%-10s%-4.2f "1aaa10.111;
printf"%-5s%-10s%-4.2f "2bbb20.146;
授予腳本執行許可權:chmo+xscrip.sh
如果使用echo就不能用格式替代符
#!/bin/bash
echoNoNameMark;
echo1aaa10.111;
echo2bbb20.146;
注意事項
在echo,printf中使用-e,-n參數時,-e,-n應該出現在命令行其它字元之前。
-e:如果要在echo的雙引號使用轉義序列作為參數得需要使用-e參數
-n:忽略末尾的換行符
不使用-e參數
[root@localhosttmp]#echo"1 2"
1 2
使用-e參數
[root@localhosttmp]#echo-e"1 2"
轉義序列:
/n:換行
/t:tab鍵
彩色輸出
字體顏色包括:0=重置,30=黑色,31=紅色,32=綠色,33=黃色,34=藍色,35=洋紅,36=青色,37=白色
背景顏色包括:0=重置,40=黑色,41=紅色,42=綠色,43=黃色,44=藍色,45=洋紅,46=青色,47=白色
echo-e"e[1;32mhelloworde[0m"
e[1;32m:將字體顏色設為綠色,e[0m:將顏色重置
;③ linux 怎麼看 文件二進制
一、在Linux下查看二進制文件的軟體:
xxd (2進制)
hexmp (16進制)
二、編輯:
1、biew
2、hexedit
3、vim
Vim 來編輯二進制文件。Vim 本非為此而設計的,因而有若干局限。但你能讀
取一個文件,改動一個字元,然後把它存檔。結果是你的文件就只有那一個字元給改了,
其它的就跟原來那個一模一樣。
要保證 Vim 別把它那些聰明的竅門用錯地方,啟動 Vim 時加上 "-b" 參數:
vim -b datafile
這個參數設定了 'binary' 選項。其作用是排除所有的意外副作用。例如,'textwidth'
設為零,免得文本行給擅自排版了。並且,文件一律以 Unix 文件格式讀取。
二進制模式可以用來修改某程序的消息報文。小心別插入或刪除任何字元,那會讓程序運
行出問題。用 "R" 命令進入替換模式。
文件里的很多字元都是不可顯示的。用 Hex 格式來顯示它們的值:
:set display=uhex
另外,也可以用命令 "ga" 來顯示游標下的字元值。當游標位於一個 字元上時,
該命令的輸出看起來就像這樣:
27, Hex 1b, Octal 033
文件中也許沒那麼多換行符。你可以關閉 'wrap' 選項來獲得總覽的效果:
:set nowrap
字 節 位 置
要發現你在文件中的當前位元組位置,請用這個命令:
g CTRL-G
其輸出十分冗長:
Col 9-16 of 9-16; Line 277 of 330; Word 1806 of 2058; Byte 10580 of 12206
最後兩個數字就是文件中的當前位元組位置和文件位元組總數。這已經考慮了 'fileformat'
選項導致換行符位元組不同的影響。
要移到文件中某個指定的位元組,請用 "Go" 命令。例如,要移到位元組 2345:
2345go
使 用 XXD
一個真正的二進制編輯器用兩種方式來顯示文本: 二進制和十六進制格式。你可以在 Vim
里通過轉換程序 "xxd" 來達到這效果。該程序是隨 Vim 一起發布的。
首先以二進制方式編輯這個文件:
vim -b datafile
現在用 xxd 把這個文件轉換成十六進制:
:%!xxd
文本看起來像這樣:
0000000: 1f8b 0808 39d7 173b 0203 7474 002b 4e49 ....9..;..tt.+NI
0000010: 4b2c 8660 eb9c ecac c462 eb94 345e 2e30 K,.`.....b..4^.0
0000020: 373b 2731 0b22 0ca6 c1a2 d669 1035 39d9 7;'1.".....i.59.
現在你可以隨心所欲地閱讀和編輯這些文本了。 Vim 把這些信息當作普通文本來對待。
修改了十六進制部分並不導致可顯示字元部分的改變,反之亦然。
最後,用下面的命令把它轉換回來:
:%!xxd -r
只有十六進制部分的修改才會被採用。右邊可顯示文本部分的修改忽略不計。
④ 怎樣使用vi編輯器修改Linux中的二進制文件
使用過Linux的人基本上都對vi有些許了解,這是Linux各種發行版都會有的標准文本編輯器,功能很強大。他不但能編輯正常的ASCII/ASIN文本文檔,也可以編輯二進制文檔的,這里我們就以Fedora為例來看一下如何使用vi編輯二進制文檔。
工具/原料
安裝了Linux的計算機/筆記本電腦
vi編輯器和需要編輯的二進制文件
方法/步驟
在Fedora桌面打開「Applications」-「System Tools」-「Terminal」打開命令終端,為vi編輯做准備。
在終端切換到要編輯的二進制文件目錄,然後輸入「vi -b test.bin」,其中「test.bin」是我要編輯的二進制文件。當然也可以直接指定vi要打開編輯的文件路徑。「-b」參數,就是告訴vi編輯器,我是在用二進制模式打開文件的。
打開文件之後,我們是很難看到文件實際內容的,因為是二進制的,文件不是可讀的,因此也不能直接編輯和修改的。這時,我們可以使用命令「:%xxd」強制將其轉化為可讀的十六進制顯示,就可以使用正常的vi命令對文件進行編輯了。
轉化之後的文件內容以十六進製表示,左側是文件偏移值。我們計劃將文件編譯00000010開始的4個十六進制字元「FFFFFFFF」修改一下。
使用正常的vi編輯器命令將十六進制字元「FFFFFFFF」修改為「88888888」,修改完成後,使用esc命令返回到vi的命令模式,然後使用命令「:%xxd -r」就可以將其重新轉化為二進制模式了。
步驟閱讀
6
轉化完成後,就可以看到,二進制顯示的內容與沒修改之前的內容已經有所差異。這時使用命令「:wq」保存退出就可以了。
⑤ linux print命令
具體參數及講解如下:
print命令的格式是:
print xxx
p xxx
1. print 操作符
@
是一個和數組有關的操作符,在後面會有更詳細的說明。
::
指定一個在文件或是一個函數中的變數。
{}
表示一個指向內存地址的類型為type的一個對象。
2. 察看內容
全局變數(所有文件可見的)
靜態全局變數(當前文件可見的)
局部變數(當前Scope可見的)
如果你的局部變數和全局變數發生沖突(也就是重名),一般情況下是局部變數會隱藏全局變數。如果此時你想查看全局變數的值時,你可以使用「::」操作符:
file::variable
function::variable
eg:
查看文件f2.c中的全局變數x的值:
gdb) p 'f2.c'::x
註:如果你的程序編譯時開啟了優化選項,那麼在用GDB調試被優化過的程序時,可能會發生某些變數不能訪問,或是取值錯誤碼的情況。對付這種情況時,需要在編譯程序時關閉編譯優化。GCC,你可以使用「-gstabs」 選項來解決這個問題。
3. 察看數組
(1)動態數組:
p *array@len
array:數組的首地址,len:數據的長度
eg:
(gdb) p *array@len
$1 = {2, 4, 6, 8, 10}
(2)靜態數組
可以直接用print數組名,就可以顯示數組中所有數據的內容了。
4. 輸出格式
x 按十六進制格式顯示變數。
d 按十進制格式顯示變數。
u 按十六進制格式顯示無符號整型。
o 按八進制格式顯示變數。
t 按二進制格式顯示變數。
a 按十六進制格式顯示變數。
c 按字元格式顯示變數。
f 按浮點數格式顯示變數。
eg:
(gdb) p i
$21 = 101
(gdb) p/a i
$22 = 0x65
(gdb) p/c i
$23 = 101 'e'
5. 察看內存
使用examine(簡寫x)來查看內存地址中的值。語法:
x/
n、f、u是可選的參數。
(1)n 是一個正整數,表示顯示內存的長度,也就是說從當前地址向後顯示幾個地址的內容。
(2)f 表示顯示的格式,參見上面。如果地址所指的是字元串,那麼格式可以是s,如果地十是指令地址,那麼格式可以是i。
(3)u 表示從當前地址往後請求的位元組數,如果不指定的話,GDB默認是4個bytes。u參數可以用下面的字元來代替,b表示單位元組,h表示雙位元組,w表示四字 節,g表示八位元組。當我們指定了位元組長度後,GDB會從指內存定的內存地址開始,讀寫指定位元組,並把其當作一個值取出來。
eg:
x/3uh 0x54320 :從內存地址0x54320讀取內容,h表示以雙位元組為一個單位,3表示三個單位,u表示按十六進制顯示。
6. 察看寄存器
(1)要查看寄存器的值,很簡單,可以使用如下命令:
info registers
(2)查看寄存器的情況。(除了浮點寄存器)
info all-registers
(3)查看所有寄存器的情況。(包括浮點寄存器)
info registers
(4)查看所指定的寄存器的情況。
寄存器中放置了程序運行時的數據,比如程序當前運行的指令地址(ip),程序的當前堆棧地址(sp)等等。你同樣可以使用print命令來訪問寄存器的情況,只需要在寄存器名字前加一個$符號就可以了。如:p $eip。
7. display自動顯示的變數
(1)格式:display[/i|s] [expression | addr]
eg:
display/i $pc
$pc是GDB的環境變數,表示著指令的地址,/i則表示輸出格式為機器指令碼,也就是匯編。於是當程序停下後,就會出現源代碼和機器指令碼相對應的情形,這是一個很有意思的功能。
(2)其他
undisplay
delete display
刪除自動顯示,dnums意為所設置好了的自動顯式的編號。如果要同時刪除幾個,編號可以用空格分隔,如果要刪除一個范圍內的編號,可以用減號表示(如:2-5)
disable display
enable display
disable和enalbe不刪除自動顯示的設置,而只是讓其失效和恢復。
info display
查看display設置的自動顯示的信息。GDB會打出一張表格,向你報告當然調試中設置了多少個自動顯示設置,其中包括,設置的編號,表達式,是否enable。
8. 設置
(1)set print address
set print address on
打開地址輸出,當程序顯示函數信息時,GDB會顯出函數的參數地址。
(2)set print array
set print array on
打開數組顯示,打開後當數組顯示時,每個元素佔一行,如果不打開的話,每個元素則以逗號分隔。
(3)set print elements
這個選項主要是設置數組的,如果你的數組太大了,那麼就可以指定一個來指定數據顯示的最大長度,當到達這個長度時,GDB就不再往下顯示了。如果設置為0,則表示不限制。
(4)set print null-stop
如果打開了這個選項,那麼當顯示字元串時,遇到結束符則停止顯示。這個選項默認為off。
(5)set print pretty on
如果打開printf pretty這個選項,那麼當GDB顯示結構體時會比較漂亮。如:
$1 = {
next = 0x0,
flags = {
sweet = 1,
sour = 1
},
meat = 0x54 "Pork"
}
(6)set print union
設置顯示結構體時,是否顯式其內的聯合體數據。
(7)set print object
在C++中,如果一個對象指針指向其派生類,如果打開這個選項,GDB會自動按照虛方法調用的規則顯示輸出,如果關閉這個選項的話,GDB就不管虛函數表了。
⑥ linux 怎麼看完二進制文件
查看二進制文件,用od或hexmp命令。
$od-tx1-tc-AxbinFile
abcde12345abcde1
2345abcde12345ab
00002063646531323334350a
cde12345
000029
-tx1選項表示將文件中的位元組以十六進制的形式列出來,每組一個位元組(類似hexmp的-c選項)
-tc選項表示將文件中的ASCII碼以字元形式列出來(和hexmp類似,輸出結果最左邊的一列是文件中的地址,默認以八進制顯示)
-Ax選項要求以十六進制顯示文件中的地址
⑦ linux bin中的二進制文件每個系統都不一樣嗎
linuxbin中的二進制文件每個系統都不一樣的。inux系統下的bin目錄下都是二進制可執行文件,bin目錄放置的是最基本的一些命令的可執行文件度Linux里某些BIN文件恰好也是裸二進制文件有些BIN文件沒有ELF頭,但不是所有的BIN都是這樣的。
linuxbin二進制可執行文件的特點
linux中bin文件是二進制可執行文件,bin目錄放置的是基於值編碼的文件,可以根據具體應用,指定某個值是什麼意思,一個可執行的二進制文件包含的不僅僅是機器指令,還包括各種數據程序運行資源,機器指令只是其中的一部分。
經過一些配置以後BIN文件也是可以在Linux上運行的,精巧設計的COM/BIN文件可以在限制極多的情況下跨平台運行,但也許只能做計算無法做輸出,大小也只有64K大,並且如果要做稍微復雜點的操作,就需要兩套機器代碼實現。
⑧ linux下沒有itoa函數,sprintf又不能轉換成二進制,那麼如何寫一個小函數,把十進制轉換成二進制
連續除以2,讓余數倒排即可,我寫了個輸出成int的,只不過這個int是二進制而已,你可以參考
int to2(int n)
{
int r=0;
int shang,yushu;
shang=n;
while(shang!=0)
{
yushu=shang%2;
r=r*10+yushu;
shang=shang/2;
}
return r;
}