Linux下Windows相關中文字元編碼研究

2021-10-09 16:38:07 字數 2152 閱讀 5296

同時學過windows和linux程式設計的知道,linux使用utf-8,windows則使用utf-16,同時保留gbk等老式字元編碼。所以有時我們在linux中會遇到與windows有關的中文亂碼,下面是常見亂碼及解決方法:

1、fat/fat32亂碼,常見於u盤,解決辦法:

mount | grep vfat

# /dev/disk on /media/volume type vfat (...)

sudo umount /media/volume

sudo mount -t vfat -o codepage=936,utf8,umask=0000 /dev/disk /media/volume

# codepage=936 - 提供給ms-dos的短檔名使用gbk(cp936),有些檔案可能只有短檔名

# utf8 - 提供給linux的檔名使用utf8,也可以使用iocharset=utf8,注意不能寫成iocharset=utf-8

# umask=0000 - 檔案和目錄許可權都是777

2、rar檔案亂碼,解決辦法:解除安裝unrar-free,安裝unrar(前者已經很長時間不維護了)

3、zip檔案亂碼,解決辦法:

# 使用unzip目前大多數情況下可以不亂碼,還是亂碼話可以用-o指定字元編碼

unzip file.zip -d dir

unzip -o gbk file.zip -d dir

# 或者用自動識別壓縮包格式的unar程式

unar file.zip

unar -e gbk file.zip -o dir

# 檢視檔案十六進製制(以便確定是什麼格式)

od -t x1 file

hexdump -c file

xxd -g 1 file

# 0a -- lf

# 0d 0a -- crlf

# ff fe -- utf-16le bom

# ef bb bf -- utf-8 bom

# crlf -> lf

sed -i 's/\r//g' file # 清除所有\r

# lf -> crlf

sed -i 's/$/\r/' file # 行尾新增\r

# utf-8 - bom

sed -i '1s/^\xef\xbb\xbf//' file # 清除bom

# utf-8 + bom

sed -i '1s/^/\xef\xbb\xbf/' file # 新增bom

# gbk/windows -> utf-8/linux

iconv -f gbk -t utf-8 file -o file # 從gbk轉換到utf-8

sed -i 's/\r//g' file # 清除所有\r

# utf-8/linux -> gbk/windows

sed -i 's/$/\r/' file # 行尾新增\r

iconv -f utf-8 -t gbk file -o file # 從utf-8轉換到gbk

# unicode/windows -> utf-8/linux

iconv -f utf-16le -t utf-8 file -o file # 從utf-16le轉換到utf-8(順序很重要)

sed -i '1s/^\xef\xbb\xbf//' file # 清除bom

sed -i 's/\r//g' file # 清除所有\r

# utf-8/linux -> unicode/windows

sed -i '1s/^/\xef\xbb\xbf/' file # 新增bom

sed -i 's/$/\r/' file # 行尾新增\r

iconv -f utf-8 -t utf-16le file -o file # 從utf-8轉換到utf-16le(順序很重要)

Windows 下nginx相關命令

1 啟動 c server nginx 1.0.2 start nginx 或c server nginx 1.0.2 nginx.exe 最好使用第一種,第二種會使你的cmd視窗一直處於執行中,ctrl c也不能終止,就算關閉cmd視窗,檢視程序管理器也能看到之前還在執行並未隨著cmd視窗關閉而結...

windows下印表機相關操作

include dword dwsize,dwprinters enumprinters printer enum local,null,5,null,0,dwsize,dwprinters byte pbuffer new byte dwsize enumprinters printer enum...

Windows和Linux下socket的區別

1.標頭檔案 windows下winsock.h或winsock2.h linux下netinet in.h 大部分都在這兒 unistd.h close函式在這兒 sys socket.h 在in.h裡已經包含了,可以省了 2.初始化 windows下需要用wsastartup啟動ws2 32.l...