CHAR文字漢字処理を実現するためにC言語を使用して

  • システム:Windows 64
  • コンパイラ:gccのバージョン8.1.0(MinGWの-W64プロジェクトによって建てられx86_64版 - POSIX-SEH-rev0の、)
  • テキストエディタ:メモ帳
  • コンソール:Cmder
  • プログラミング言語:C、Pythonの

  まず、中国語の文字を印刷するために、考慮にコーディングの問題を取る必要があります。Windows環境下での符号化方式を使用するので、GBK、UTF-8を解析するときに使用され、原因歪みGCCのコードは、次のことを実行します:

する#include <stdio.hの> int型のmain()
{ CHAR * STR = " 你好、世界!" 
    printf(" %sの\ n " 、STR)。リターン0 ; 
}


    


     

 

 

 

  解決策次のように「使用-fexec-のcharset = GBK」コマンドを

 

  コーディングの問題を解決するため、我々はまた、それを知っておく必要があります。

  • すなわち、char型の数は本質的に1バイト(すなわち、8個)、文字を印刷することにより%のD、%Cを印刷することによって符号化することができる占めます
  • C言語では、文字は2種類の文字を占めます
  • 2つの中国の文字のchar型は、負であります
  • 漢字の印刷が、それは2つの文字が続かなければなりません

  これらの点によると、私たちは文字を印刷し、そのコード化することができます:

書式#include <stdio.hに> 
する#include < 文字列の.h> int型のmain()
{ // 文字リテラルにSTRの文字ポインタ、 '\ 0'末端からリテラル文字のchar * STR = " こんにちは、 !世界こんにちは、世界!" ;
     // 文字リテラル列strの最初の文字のアドレスにCHR文字ポインタは指さその最初の2つの文字で『あなた』の文字のchar * CHR = STR ; 
    のprintf(" %S%ZU \ N- " 、(STR)strlenを、STR);
     // それがある場合に'\ 0'の文字列の末尾を示す一方を(* CHR =!' \ 0 ' 
    { // もしCHRコードは、それが発生した漢字を示し、負のIFを *(CHR <0 


    
    
    

    
        
        
        { 
            // 漢字を印刷して、コーディング漢字
             // 注意が密接に2つの文字の印刷(%C%C)が続かなければなりません、そうでない場合は??プリントアウトされます 
            のprintf(" :%C%C%D%D \ N- "、 CHR *、*(CHR + 1)*(CHR)、*(CHR + 1 ));
             // 各文字を二チャー組成物から構成されているので、CHRは2バイト(インクリメント) 
            CHR + = 2 ; 
        } 
        
        { 
            // 英語の文字を印刷する 
            のprintf(" :D%\ N-%C "、CHR *、* ; CHR)
             // CHR増分Aバイト 
            ++ CHR; 
        } 
    } 

    戻り値 0を
}

  図から、我々が見ることができ、文字列が25バイト、4つの文字と2つの全角記号は、25バイトの合計を12バイト、プラス23個の英語の文字を占めを占めています。私たちは、より明確に図STRの設定から見ることができます。

  しかし、私たちのオンラインクエリの結果によると、漢字「あなた」GBKのあるべきコーディング:C4E3を、しかし、ここで、それが出て印刷します。-60-29、これはなぜか?

  Aryの問題は、それがかもしれない、ここに関与-60-29進数C4E3の小数点以下を?

  まず、のは、Pythonによるバイナリと小数のC4E3を見てみましょう。これは、-60-29に外れていないようでした。

  <limits.hに>ヘッダ・ファイルをインポートするには、以下のコードを見てみましょう、範囲のどのくらいを参照するにはchar型:

する#include <stdio.hに> 
する#include <limits.hに> int型のmain()
{ 
    のprintf(" [%のD〜%のD] \ n " 、CHAR_MIN、CHAR_MAX)。
    printf( "%C%C \ n"は、0xC4、0xE3)。リターン0 ; 
}

 

  我们可以看到:char类型的取值范围为[-128 ~ 127],但是我们却可以打印出汉字”你“。这是为什么呢?明明char的取值范围最多127,而汉字“你”的两个字符分别为:196和227,都超过了这个值。其实这是因为,C语言将这两个数字的二进制数作为负数处理。C中的char类型有1个字节,占8位,而它的最高位为符号位,当它为0时为正,1时则为负。C通过对正数做补码操作得到负数。补码,即对一个二进制数取反,然后再加1。比如,0xC4的二进制数为0b11000100,我们可以看到最高位1,在C中这个数就是负数。我们可以通过对这个二进制数做补码操作,得到0b00111100,即60。所以0b11000100在C中表示为-60。

   从以上,我们可以发现,GBK编码中,一个汉字占两字节。因为C中char类型只占一个字节,所以需要使用两个char类型来表示汉字。一个字节能够表示的范围为[0 ~ 256],因为C中char为有符号类型,char的表示范围为[-128 ~ 127],所以在遇到大于127的数字时,会被char表示为负数。

おすすめ

転載: www.cnblogs.com/noonjuan/p/12319727.html