Penyelesaian kepada kod soket Linux yang kacau: 1. Buka tetingkap arahan terminal 2. Gunakan arahan iconv untuk menukar set aksara fail Linux adalah seperti "iconv -f utf-8 -t gb2312 /server_test/reports/ software_.txt > /server_test/reports/software_asserts.txt".
Persekitaran pengendalian tutorial ini: sistem linux5.9.8, komputer Dell G3.
Apakah yang perlu saya lakukan jika soket Linux rosak?
masalah linux, tingkap, soket kacau
Penerangan masalah:
Terdapat klien ftp yang ditulis sendiri dalam linux, dan terdapat ftp terbina dalam klien dalam tingkap. Pelayan ftp yang dibina oleh perisian, apabila saya mencipta direktori yang mengandungi aksara Cina atau nama fail yang mengandungi aksara Cina pada pelayan melalui program, nama Cina menjadi kacau bilau
Analisis masalah:
Tidak syak lagi bahawa Ia disebabkan oleh masalah pengekodan, jadi bagaimana untuk mengesahkan pengekodan yang mana sepatutnya? Baidu kemudiannya mendapati bahawa ubuntu menggunakan utf-8 secara lalai, manakala windows menggunakan gbk secara lalai, jadi cuma pastikan kandungan yang mengandungi laluan Cina ditukar kepada gbk apabila ia dihantar
Penyelesaian:
Penukaran antara utf8 dan gbk:
penukaran set aksara fail linux (utf8-gb2312)
1, baris arahan
Apabila melakukan penukaran pengekodan pada LINUX, anda boleh menggunakan arahan iconv untuk mencapai ini untuk fail, iaitu, menukar fail yang ditentukan daripada satu pengekodan kepada pengekodan yang lain.
penggunaan arahan iconv adalah seperti berikut:
iconv [选项...] [文件...]
Spesifikasi format input/output:
-f, --from-code=名称 原始文本编码 -t, --to-code=名称 输出编码
Senaraikan semua set aksara yang diketahui -l, --senarai
Kawalan output:
-c 从输出中忽略无效的字符 -o, --output=FILE 输出文件 -s, --silent 关闭警告 --verbose 打印进度信息
Contoh:
iconv -f utf-8 -t gb2312 /server_test/reports/software_.txt > /server_test/reports/software_asserts.txt
Sila muat turun pustaka libiconv pada papan terbenam untuk fail perpustakaan yang diperlukan berikut
Aplikasi fungsi
1. Fail pengepala
#include <iconv.h>
2. Fungsi
(1) iconv_t iconv_open(const char *tocode, const char *fromcode);
Fungsi ini menerangkan yang mana dua operasi akan dilakukan Untuk penukaran pengekodan, tocode ialah pengekodan sasaran dan fromcode ialah pengekodan asal Fungsi ini mengembalikan pemegang penukaran untuk digunakan oleh dua fungsi berikut.
(2) size_t iconv(iconv_t cd,char **inbuf,size_t *inbytesleft,char **outbuf,size_t *outbytesleft);
Fungsi ini membaca aksara daripada inbuf dan menukarnya Kemudian output kepada outbuf, inbytesleft digunakan untuk merekodkan bilangan aksara yang belum ditukar, dan outbytesleft digunakan untuk merekodkan baki ruang penimbal keluaran.
(3) int iconv_close(iconv_t cd);
Fungsi ini digunakan untuk menutup pemegang penukaran dan melepaskan sumber.
3. Contoh: Program sampel penukaran dilaksanakan dalam bahasa C
#include "stdio.h" #include "string.h" #include "iconv.h" #include "stdlib.h" static int charset_convert( const char *from_charset, const char *to_charset, char *in_buf, size_t in_left, char *out_buf, size_t out_left) { iconv_t icd = (iconv_t)-1; size_t sRet = -1; char *pIn = in_buf; char *pOut = out_buf; size_t outLen = out_left; if (NULL == from_charset || NULL == to_charset || NULL == in_buf || 0 >= in_left || NULL == out_buf || 0 >= out_left) { return -1; } icd = iconv_open(to_charset, from_charset); if ((iconv_t)-1 == icd) { return -1; } sRet = iconv(icd, &pIn, &in_left, &pOut, &out_left); if (( size_t )-1 == sRet) { iconv_close(icd); return -1; } out_buf[outLen - out_left] = 0; iconv_close(icd); return ( int )(outLen - out_left); } static int charset_convert_UTF8_TO_GB2312( char *in_buf, size_t in_left, char *out_buf, size_t out_left) { return charset_convert( "UTF-8" , "GB2312" , in_buf, in_left, out_buf, out_left); } static int charset_convert_GB2312_TO_UTF8( char *in_buf, size_t in_left, char *out_buf, size_t out_left) { return charset_convert( "GB2312-8" , "UTF-8" , in_buf, in_left, out_buf, out_left); } int main() { char *pIn = "hello 中国人" ; char *pOut = NULL; size_t outLen = 0; size_t inLen = 0; int iRet = -1; inLen = strlen (pIn); outLen = inLen * 3; pOut = ( char *) malloc ( sizeof ( char ) * outLen); if (NULL == pOut) { return -1; } memset (pOut, 0, sizeof ( char ) * outLen); iRet = charset_convert_UTF8_TO_GB2312(pIn, ( size_t )inLen, pOut, ( size_t )inLen); if (-1 == iRet) { return -1; } printf ( "out = %s;\touLen = %d\n" , pOut, iRet); free (pOut); pOut = NULL; return 0; }
Pelaksanaan ini boleh merentas platform, yang saya fikir secara peribadi lebih baik~
ps: ftp dilakukan sebelum Pelanggan berada di Windows Kerana Pihak A berkata ia ingin memindahkannya, ia beralih kepada Windows Kemudian masalah di atas berlaku Walaupun saya membandingkan penyelesaian Cina yang muncul dalam projek itu, saya sekurang-kurangnya mengumpul pengalaman dalam menyelesaikan masalah (tidak perlu bahasa Cina, pinyin tidak mengapa)
Cadangan berkaitan: "Tutorial Video Linux"
Atas ialah kandungan terperinci Apa yang perlu dilakukan jika soket linux rosak. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!