ホームページ  >  記事  >  運用・保守  >  Linuxソケットが文字化けした場合の対処方法

Linuxソケットが文字化けした場合の対処方法

藏色散人
藏色散人オリジナル
2023-03-16 09:26:301761ブラウズ

Linux ソケットの文字化けコードの解決策: 1. ターミナル コマンド ウィンドウを開きます; 2. iconv コマンドを使用して Linux ファイルの文字セットを変換します。変換コマンドは「iconv -f utf-8 -t」などです。 gb2312 /server_test/reports/software_.txt > /server_test/reports/software_asserts.txt」。

Linuxソケットが文字化けした場合の対処方法

#このチュートリアルの動作環境: linux5.9.8 システム、Dell G3 コンピューター。

Linux ソケットが文字化けしている場合はどうすればよいですか?

Linux、Windows、ソケットの文字化け問題

問題の説明:

Linux で自分が作成した FTP クライアントがあり、組み込みの FTP クライアントがあります。 Windows クライアント ソフトウェアで構築した FTP サーバーで、プログラムを使用してサーバー上に中国語を含むディレクトリまたは中国語を含むファイル名を作成すると、中国語名が文字化けします

問題分析:

エンコードの問題が原因であることは間違いありませんが、どのエンコードにすべきかを確認するにはどうすればよいでしょうか? Baidu は後に、ubuntu はデフォルトで utf-8 を使用し、Windows はデフォルトで gbk を使用することを発見しました。そのため、中国語のパスを含むコンテンツが送信されるときに必ず gbk に変換されるようにしてください。

解決策:

utf8 と gbk の間の変換:

Linux ファイル文字セット変換 (utf8-gb2312)

1、コマンド ライン

LINUX でエンコード変換を実行する場合、iconv コマンドを使用してこれを実現できます。これはファイル用であり、指定されたファイルをあるエンコードから別のエンコードに変換します。

iconv コマンドの使用方法は次のとおりです。

iconv [选项...] [文件...]
  • 入出力形式の指定:

  -f, --from-code=名称 原始文本编码
  -t, --to-code=名称 输出编码
  • # #List 既知のすべての文字セット -l, --list

  • 出力制御:

  •   -c   从输出中忽略无效的字符
      -o, --output=FILE   输出文件
      -s, --silent   关闭警告
      --verbose   打印进度信息
例:

iconv -f utf-8 -t gb2312 /server_test/reports/software_.txt > /server_test/reports/software_asserts.txt

次の必須ライブラリ ファイル

2、関数アプリケーション

1.ヘッダー ファイル

#include <iconv.h>
の組み込みボード上の libiconv ライブラリをダウンロードしてください。

2. 関数

(1) iconv_t iconv_open(const char *tocode, const char *fromcode);

この関数は、どの 2 つのエンコーディングが変換されるかを説明します (tocode がターゲット エンコーディングです) 、fromcode は元のエンコーディングであり、この関数は次の 2 つの関数で使用する変換ハンドルを返します。

(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);

この関数は、変換ハンドルを閉じてリソースを解放するために使用されます。

3. 例: 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;
}

この実装はクロスプラットフォームに対応でき、個人的にはその方が良いと思います~

ps: FTP以前作ったクライアントが Windows だったのですが、A が移植したいと言うので Windows に切り替えたところ、上記の問題が発生しました プロジェクトに登場した中国のソリューションと比較しましたが、少なくとも解決の経験は積んできました。問題 (中国語は使用できません。ピンインは使用できます)

関連する推奨事項: 「

Linux ビデオ チュートリアル

以上がLinuxソケットが文字化けした場合の対処方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。