■ 文字コード                                                         
   ・ アスキーコード、JIS標準文字コード(JJIS X 0201)
     制御コード
   ・ PCからの送信文字


  
 ■ アスキーコード

      ・   文字コードはアスキー(ASCII)コードが基本です。 もともとは、ANSI(米国規格協会) が制定した文字コードで American Standard
     Code for Information  Interchangeの頭文字をとったものです。ANSIコードと呼ばれることもあります。 7ビット(0~127)の文字
    コードセットの文字コードセットで、今ではISO 646にもなっています。

 ■ ANKコード(JIS X 0201)
   ・ このアスキーコードの上位 ビット A0~DFの部分にカタカナ等を追加して(部分)、また\(バックスラッシュ) を¥(円記号) 、
     ~(チルダ)を ¯(オーバーバー)に変更(部分)して 規格化した8ビットのコードセットががJIS半角英数カナ文字コード(JIS X
      0201) です。通称、ANK(Alphabet Numeric Kana: アンク)コードと呼ばれます。
      
      (注) 半角のバックスラッシュ \ はフォントをArial にして\をキーインすると表示することができます。

   ・日本のJIS X 0201のようにASCIIコードの無定義MSBを”1”にした8ビットの半角文字コードセットが世界各国にありISOで規格化されて
    います。~
       (例) ISO 8859-1 (西欧文字追加)、ISO8859-5(ロシア語用キリル文字追加)、ISO 8859-6(アラビア文字追加)他

                      

< ASCIIコード vs ANKコード比較  16進数表示 >
ASCIIコード
(ISO 646)
 
ANKコード
(JIS X 0201)
上位
下位..........
0 1 2 3 4 5 6 7
0 NULL DLE SPC 0 @ P p
1 SOH DC1 ! 1 A Q a q
2 STX DC2 " 2 B R b r
3 ETX DC3 # 3 C S c s
4 EOT DC4 $ 4 D T d t
5 ENQ NAK % 5 E U e u
6 ACK SYN & 6 F V f v
7 BEL ETB ' 7 G W g w
8 BS CAN ( 8 H X h x
9 HT EM ) 9 I Y i y
A LF SUB * : J Z j z
B HM ESC + ; K [ k {
C CL FS , < L \ l |
D CR GS - = M ] m }
E SO RS . > N ^ n ~
F SI US / ? O _ o DEL
 
上位
下位..........
0 1 2 3 4 5 6 7 8 9 A B C D E F
0 NULL DLE SPC 0 @ P p          
1 SOH DC1 ! 1 A Q a q        
2 STX DC2 " 2 B R b r        
3 ETX DC3 # 3 C S c s        
4 EOT DC4 $ 4 D T d t        
5 ENQ NAK % 5 E U e u        
6 ACK SYN & 6 F V f v        
7 BEL ETB ' 7 G W g w        
8 BS CAN ( 8 H X h x        
9 HT EM ) 9 I Y i y        
A LF SUB * : J Z j z        
B HM ESC + ; K [ k {        
C CL FS , < L l |        
D CR GS - = M ] m }        
E SO RS . > N n ¯        
F SI US / ? O _ o DEL        

   ・ 制御コード
      下記のコードは制御コードと呼ばれ、データ通信で機器の制御やデータの制御などにつかわれます。 C、C++
    言語のプログラムのなかでコピーしてつかえるようにプリプロセッサの形で書いてあります。


#define NULL 0x00    //ヌル  //エスケープ文字: \0
#define SOH  0x01    //Start of Heading   ヘッダー開始
#define STX  0x02    //Start of Text テキスト開始
#define ETX  0x03    //End of Text テキスト終了
#define EOT  0x04    //End Of Transmission 転送終了
#define ENQ  0x05    //ENQuiry 問い合せ、エンク
#define ACK  0x06    //Acknowledge 肯定応答 アック
#define BEL  0x07    //Bell ベル   
//エスケープ文字: \a
#define BS   0x08    //Back Space バックスペース  
//エスケープ文字: \b
#define HT   0x09    //Horizontal Tabulation 水平タブ   
//エスケープ文字: \t
#define LF   0x0a    //Line Feed 改行  
//エスケープ文字: \n
#define VT   0x0b    //Vertical Tabulation 垂直タブ   
//エスケープ文字: \v
#define FF   0x0c    //Form Feed 改ページ   
//エスケープ文字: \f
#define CR   0x0d    //Carriage Return 復帰   
//エスケープ文字: \r
#define SO   0x0e    //Shift Out シフトアウト
#define SI   0x0f    //Shift In シフトイン
#define DLE  0x10    //Data Link Escape 伝送制御拡張
#define DC1  0x11    //Device Control 1 装置制御1
#define DC2  0x12    //Device Control 2 装置制御2
#define DC3  0x13    //Device Control 2 装置制御3
#define DC4  0x14    //Device Control 4 装置制御4
#define NAK  0x15    //Negative Acknowledge 否定応答 ナック
#define SYN  0x16    //Synchronous idle 同期信号
#define ETB  0x17    //End of Transmission Block 転送ブロック終了
#define CAN  0x18    //Cancel 取消 キャンセル
#define EM   0x19    //End of Medium 媒体終端
//#define SUB  0x1a    //Substitute 置換
#define EOF  0x1a    //End of File MS-DOSにおけるテキストファイルの終端文字//Windowsのテキストファイル終端にはない
#define ESC  0x1b    //Escape 拡張 エスケープ
#define FS   0x1c    //File Separator ファイル分離
#define GS   0x1d    //Group Separator グループ分離
#define RS   0x1e    //Record Separator レコード分離
#define US   0x1f    //Unit Separator ユニット分離
#define SPC  0x20    //Space 空白 スペース
#define DEL  0x7F    //Delete 削除 デリート


・改行コード
   タイプライタ時代からの歴史的経緯から改行コードはシステムによりことなる。 プログラムで\nと書いた場合、この改行コードは
 システム(コンパイラ)により  それぞれLINUXはLF(0x0A)に、WindowsはCR(0x0D) + LF(0x0A)に、Macintoshは CR(0x0D)に
 コンパイルされる。

      ① UNIX、LINUX  : LF(0x0A
      ② MS-DOS、 Windows : CR(0x0D) + LF(0x0A)
      ③ Macintosh : CR(0x0D)

  以下に Windowsのアクセサリとして付属している、メモ帳で作成したてテキストファイルをバイナリーエディタ(スターリング)でみた結果を示す。

メモ帳での表示 バイナリーエディタでの見た場合 備考
Windows標準の 「メモ帳」で
作成したテキストファイル
改行コードが
0x0D + 0x0Aである
ことがわかる。





  JIS漢字コード
 
 ■ 文字サイズ
    すべて2バイトで構成されている文字コードセットです。1バイトのANK文字はふくまれて いません。
   ■ JIS化された漢字のコードセットです。現在は①のJIS拡張漢字コードが主流となってきている。
     2000年以前は②③が使用されていたこともあり今でも各方面で②③は使用されている。
   ■ Microsoftは、2007年に発売したWindows Vistaから、標準搭載フォントの字形を旧来のJIS X 0208:1990のものから、JIS X 0213:2004のものに変更した

   ① JIS拡張漢字コード(JIS X 0213:2004)
    ・ 符号化文字集合を規定している規格である。
    ・ Unicode3.2版(2002年3月制定から ユニコードに正式採用されている。
    ・ 11,233文字から構成されています。
    ・ JIS X 0212がJIS X 0208にない文字を集めた文字集合であるのに対し、JIS X 0213はJIS X 0208を包含し更に第3・第4水準
      漢字などを加えた上位集合となっています。
    ・ 第3水準漢字数は1908文字、第4水準漢字2436字である。
    ・ JIS X 0213の代表的な符号化方式(注)としては、下記4つがある。
       1. ISO-2022-JP-2004
       2. Shift_JIS-2004
       3. EUC-JIS-2004
       4. UTF-8

       (注) 文字符号化方式とは、符号化文字集合で文字に対応付けた非負整数値を、実際にコンピュータが利用できるデータ列(通常、バイト列)に変換する符号化方式。

   
   ② JIS基本漢字コード(JIS X 0208:1990)
    ・ 正式名称は「7ビット及び8ビットの2バイト情報交換用符号化漢字集合」です。
    ・ 第1、第2バイトとも 16進数表記で 0x21~0x7Eの範囲で定義されており、94×94 = 8,836 の文字を表すことができる領域が確保
      されています。
    ・ 1990年版では6,879文字及び図記号から構成されています。。
第1バイトの 0x30 からは第1水準漢字 2,965文字、第1バイトの0x 50
      からは 第2水準漢字 3,390文字 が規定されています。
   ③ JIS補助漢字コード(JIS X 0212:1990)
    ・ 正式名称は「情報交換用漢字符号―補助漢字」です。
    ・ JIS X 0208に含まれていないもので、日常の国語の文章の表記に用いる文字として必要だと思われる文字が収録されています。
    ・ 6,067字の文字が規定されています。漢字は第3水準、第4水準会わせ5801文字で構成されています。
    ・ Unicode2.1から採用されった。。
    ・ OSとしては、WindowsNT4.0、2000、XP、Vistaに採用されています。但し、実際に使用できるためにはアプリケーション側での適応が
      必要です。
   


 ■ シフトJIS
    MS-DOSの時代にできた『符号化方式』で、日本語半角英数カナコード(JIS X 0201)の 80~9F、 または E0~FF が空いていることを利用して
   これらのを第1バイトとして次にくる第2バイトを組み合わせて漢字コードを規定する符号化方式である。
    下記の長所①②③と云った点からCPUリソースの小さい組み込みマイコンとPC間や通信の相手が特定できる場合の通信用”漢字コード
   セット”として、シフトJISの文字コードセットはきわめて有用である。

   <長所>
     ① 2バイトの全角文字と、1バイトのJIS X 0201で定義したいわゆる半角カナ文字を同一のコード体系で表現できる。
     ② エスケープシーケンスなしで漢字を2バイトで表現できる
     ③ MS-DOS時代の漢字ROMなど膨大なハード、ソフトの技術資産がある。
     ④ 以前は シフトJIS文字コードセットに方言が多く混乱した時代があったが最近はSift-JIS 2004(IANA(アイアナ):Internet Assigned
         Numbers Authority)が制定されるなど統一化&規格化が進んできている。
     ⑤ 以前は、全角文字は、JIS X 0208の6,879文字(内訳:第1水準漢字2,965文字、第2水準漢字3,390文字を中心として、ひらがな、
       カタカナ、各種記号や、ギリシャ文字、キリル文字などの非漢字524字)であったが、Sift-JIiS 2004からは4,354文字(内訳:第3水準
       文字1,259字、第4水準漢字2,346字記号659字)が追加され11,233文字となった。
 
  <欠点>
     ① 半角カナを1バイト領域に確保していることからインターネットなどグローバルな通信で使用すると問題が発生する。
     ② 2バイト目にASCIIコードと同じ0x80以下が現れるので文字列後部から判読しずらい。
     ③ 0x5C(\バックスラッシュ、¥に相当)が漢字の2バイト目に使用されている。CやPerlなどでは0x5Cはエスケープシーケンス(予約語)に
       使用されている。 シフトJISを想定していないプログラミング環境で問題が発生する。
     ④ JIS X 0208(JIS 漢字コード)は表示できるが 補助漢字は表示できない。
     ⑤ 方言が沢山ある。(IBM PC-DOS Code、NEC MS-DOS Code、Microsoft Windows Code-Japanese Shift JIS)


  <シフトJISで使われている値>

   シフトJISで使われている値は下表の部分です。                     

1バイト目
0x81~0x9f, 0xe0~0xfc

上位
下位..........
0 1 2 3 4 5 6 7 8 9 A B C D E F
0 NULL DLE SPC 0 @ P p          
1 SOH DC1 ! 1 A Q a q        
2 STX DC2 " 2 B R b r        
3 ETX DC3 # 3 C S c s        
4 EOT DC4 $ 4 D T d t        
5 ENQ NAK % 5 E U e u        
6 ACK SYN & 6 F V f v        
7 BEL ETB ' 7 G W g w        
8 BS CAN ( 8 H X h x        
9 HT EM ) 9 I Y i y        
A LF SUB * : J Z j z        
B HM ESC + ; K [ k {        
C CL FS , < L l |        
D CR GS - = M ] m }        
E SO RS . > N n ¯        
F SI US / ? O _ o DEL        

2バイト目
                       0x40~0x7e, 0x80~0xfc                      

上位
下位..........
0 1 2 3 4 5 6 7 8 9 A B C D E F
0 NULL DLE SPC 0 @ P p          
1 SOH DC1 ! 1 A Q a q        
2 STX DC2 " 2 B R b r        
3 ETX DC3 # 3 C S c s        
4 EOT DC4 $ 4 D T d t        
5 ENQ NAK % 5 E U e u        
6 ACK SYN & 6 F V f v        
7 BEL ETB ' 7 G W g w        
8 BS CAN ( 8 H X h x        
9 HT EM ) 9 I Y i y        
A LF SUB * : J Z j z        
B HM ESC + ; K [ k {        
C CL FS , < L l |        
D CR GS - = M ] m }        
E SO RS . > N n ¯        
F SI US / ? O _ o DEL        





 ■ ユニコード 要約

<特徴>
 ・一つの文字に対して、全世界で重複のない、ユニークな文字コードが設定されている。

<歴史・現在>
    ・ ゼロックス、マイクロソフト、IBM、サンマイクロシステムなどがUnicodコンソーシアムをつくり開発を進めた。
    ・ 1993年にISO10646の一部に採用された。徐々にUnicodeがISO10646になる流れとなっている。
    ・ 現時点(2008.11.24)では Unicode 第5.1版(2008年4月制定)である。

  <文字サイズ> 
     文字コードセットしては2~4バイトの可変長になっている。
    ・ 開発当初は2バイト固定長であったが 対応文字数が 2バイトの65536以上となったことからUnicode第2.0以降変更となった。

  <サロゲートペア>
      ・ 未使用の2バイト+2バイト で4バイトの文字コードを設定し、文字コード数不足に対応することとなった。 そして、この4バイトの
        文字はサロゲート文字、また2つの2バイトのペアはサロゲートペアと命名された。
      ・ サロゲートペア(Surrogate Pair:代理ペア)と呼ばれる予備バイトを使用した2バイトのペアをBMP(Basic Multilingual Plane)面に
       1,048,576(=1024×1024)個つくり各ペアに1個の文字を割り当て不足分に割り当てる方式が採用されている。この結果、4バイトの文字が
       出現してしまうこととなったが 1,112,064(= 256×256 - 1024×2 + 1024×1024)個の文字にUnicodeコードを割り当てることができるように
       なった。
        具体的には 0xD800~0xDBFF(上位サロゲート) と 0xDC00~0xDFFF(下位サロゲート)が 4バイト文字に使用されてる。


   <日本語>
     ・ JIS漢字コードは Unicode 第3.2版(2002年3月制定)からJIS X 0213が正式採用されている。JIS X 0213の一部の漢字はサロゲートペア
       方式の拡張領域に配置されている。OSとアプリケーションが共に対応していないと表示できない。
     ・ JIS X 0213は CJK(Chinese-Japanes-Korean)統合漢字の一部となっている。
     ・ ANKコード(JIS半角英数カナ文字コード:JIS X 0201)は当然ながらは採用されていない。したがって 半角カタカナ、半角円記号\、半角
       オーバーバー ̄はUnicodeには存在しない。

   <OS>
     ・ NT4.0、Windows2000、XP、Vista、Mac、Linuxの内部で採用されている。
     ・ WindowsはシフトJISコードからUnicodeへの転換期にある。

   <ファイルの読み書き>
     ・プログラムはシフトJISのファイルを呼び出すとき、すまわちメモリにロードする時Unicodeに変換している。Unicodeで処理を行い、ファイルに
      書き込む時はシフトJISに変換してファイルしている。

   <コードセットの調べ方>
     ・  Unicode Consortiumの URL : Unihan Database で調べることができる。

   <ユニコード表記>
       ユニコードの文字表記であることを明記する場合は、16進文字の前に ” U+ ”をつける。(例 及び下表参照)

       例  あ : U+3042


   <ユニコードの例>
       数値の表記は、decimalを除きすべて16進数表記です。尚、decimalは10数表記です。

文字
( )内の文字は表示されません
ユニコード表記 decimal UTF-8 UTF-16 UTF-32 備考
U+3042 12354 E3 81 82  3042 00003042 ひらがな
U+3044 12356 E3 81 84  3044 00003044 ひらがな
U+3046 12358 E3 81 86 3046 00003046 ひらがな
U+6771 26481 E6 9D B1 6771 00006771 漢字
U+4EAC 20140 E4 BA AC 4EAC 00004EAC 漢字
U+90FD 37117 E9 83 BD  90FD 000090FD 漢字
A U+41 65 41 0041 00000041 アルファベット
B U+42 66 42 0042 00000042 アルファベット
C U+43 67 43 0043 00000043 アルファベット
0 U+30 48 30 0030 00000030 数字
1 U+31 49 31 0031 00000031 数字
2 U+32 50 32 0032 00000032 数字
(NULL) U+0 0 00 0000 00000000 ヌル:0x00、制御文字、非表示
(STX) U+1 1 01 0001 00000001 制御文字、非表示
(SOT) U+2 2 02 0002 00000002 制御文字、非表示
(LF) U+A 10 A 000A 000000A 制御文字、非表示、Line Feed 改行
(VT) U+B 11 B 000B 0000000B 制御文字、非表示、Vertical Tabulation 垂直タブ
(FF) U+C 12 C 000C 0000000C 制御文字、非表示、Form Feed 改ページ
# U+0023 35 23 0023 00000023 特殊記号
% U+0025 37 25 0025 00000025 特殊記号
\ U+005C 92 5C 005C 0000005C 特殊記号、バックスラッシュ:0x5C

■ ユニコードの構成  

ユニコード表記   名称  文字数  内容  備考
 U+0000~U+007F  アスキー(ASCII) 128   制御文字、英数字  半角英数は0xFF10~0xFF5Aに設定されている
 U+0080~U+00FF  Latin1 128  フランス・ドイツ・イタリア・スペイン・ポルトガルなど、
西ヨーロッパ諸国で共通に使われている文字コード
半角カタカナは0xFF66-0x9Dに設定されている 
         
 U+3041~U+3096  ひらがな    あいうえおぁぃぅぇぉ……  
 U+30A1~U+30FA  カタカナ    アイウエオァィゥェォ……  
         
 U+4E00~U+9FFF  CJK統合漢字
(CJK Unified Indeographs)
 約20,000    
 U+3400~U+4DBF  CJK統合漢字拡張A  約6,500    1999年9月制定
 U+20000~U+2A6DF  CJK統合漢字拡張B  約42,000    2001年3月制定
 U+2A700~U+2B73F  CJK統合漢字拡張C  4,149    2008年12月制定
 U+2B740~U+2B81F  CJK統合漢字拡張D  222    2010年10月制定
 U+2B820-U+2CEA1  CJK統合漢字拡張E  5,762    2014年9月制定
 U+F900~U+FAFF
U+2F800~U+2FA1F
 CJK互換漢字    CJK統合漢字の中にある文字ではあるが若干
形状の異なる文字などが制定されている
(例)
 (統合漢字 U+6B04)
  
(互換漢字 U+F91D) 
互換漢字はIVS (Ideographic Variation Sequence)
を統合漢字に追加して区別方向にある

■ ユニコード と JIS漢字
・JIS漢字はCJK統合漢字にすべて網羅されている。
 JIS漢字(JIS X 2013(2002))は、2002年3月に制定されたUnicode 3.2.0から正式対応となった。

・JIS漢字は JIS X 0213で制定されている。JIS X 0213(2004年)には11,233字が規定されている。
 JIS X 0213は、非漢字、JIS第1~第4水準漢字をふくむ上位規格である

制定年 第1水準漢字 第2水準漢字 第3水準漢字 第4水準漢字 非漢字 合計
1978年 2,965字 3,384字 - - 453字 6,802字
1983年 3,388字 524字 6,877字
1990年 3,390字 6,879字
1997年
2000年 1,249字 2,436字 1,183字 11,223字
2004年 1,259字 11,233字



 ・漢字の水準  

水準  分類  内容
第1水準漢字   使用頻度の高い漢字 当用漢字字体表、当用漢字補正案および人名用漢字別表を基本として、
多種の漢字表に共通して出現する文字が選ばれた 
都道府県名および市区町村名に使用される漢字は、すべて第1水準に含まれている
 第2水準漢字  使用頻度の低い漢字  
 第3水準漢字  日常生活で使われることはほとんどない漢字  
 第4水準漢字  日常生活で使われることはほとんどない漢字  


          


■ ISO-2022-JP

 ・ JISコードと呼ばれることもある。
 ・e-mail等 インターネットなどのグローバルな環境で日本語を使用する場合に使用されている文字符号化方式である。
 ・「JIS X 0208:1997」に基づく文字符号化方式ことである。
 ・通称として「JISコード」とも呼ばれている。 シフトJISなどより歴史は古い。JIS X 0208の初版制定は:1978年である。
 ・学術的なことも考慮したことから、文字集合としてはテン文字集合、国際基準版図形文字なども含まれている。
 ・ ISO-2022-JPは、JIS X 0213の符号化方式のひとつで、7ビットのみを用いる1バイト文字集合2バイト文字集合を切り替えて使用する符号化方式である。
  (JIS X 0213:2004の附属書2による)
 

      コードレンジ      通称 規格 備考
1バイト文字集合 0x20 ~ 0x7f ASCII文字 ANSI、ISO646
2バイト文字集合 0x2121 ~  0x747e JIS漢字 JIS X 2013


 ■ エンディアン

  データをメモリ上に配置する方式のことをいう。多々あるが実際にはビッグエンディアンとリトルエンディアンを理解していればよいと思います。
 Windowsは視覚的にわかりにくいリトルエンディアンです。
  (1) ビッグエンディアン
     メモリ上にデータをならべるとき 上位にデータの上位バイトを順番にならべる方式を云う
  (2) リトルエンディアン
    メモリ上にデータをならべるとき 下位から順番にデータの上位バイトをならべる方式を云う。

    (例) 16進数で0xABCDEFGH をメモリ上、アドレス0x00000000~0x00000003に並べた場合を例にとると下表となる。
    

  アドレス番号     ビッグエンディアンの場合
(IBM汎用機、Sun Spark、モトローラ MC68000等)  
  リトルエンディアンの場合
(インテルX86系)  
 備考 
0x00000000 AB GH  
0x00000001 CD EF  
0x00000002 EF CD  
0x00000003 GH AB  



 ■ エンコーディング
   コンピュータや通信の分野では、データをシリアルのバイト列に変換すること、またはその変換規則を「エンコーディング」と呼ぶ。エンコー
  ディングには ユニコードには下記3通りがある。
   (1) UTF-8
      
      <長所>
        ・ASCII文字と互換性がある
        ・英数字は1バイトとなる為英語圏ではCPUの処理効率がよい。
        ・バイト単位でのデータ転送のためエンディアンの区別が不要である。

      <短所>
       ・1バイト~6バイトの可変長となり、小規模システムにとっては負担が大きい
       ・漢字は3バイト以上である。漢字が多いデータであればUTF-16のほうがCPUの処理効率は高い。
 
     
      ★ UTF-8は 以下のルールで シリアルのバイト列に変換される。
         ① U+0000~U+007Fは1バイトで、
           U+0080~U+07FFは2バイトで、
           U+0800~U+FFFFは3バイトで、
          U+10000~U+10FFFFは4バイトに表現する。

Unicode UTF-8 バイト数   
U+0000~U+007F 00~7F  1  
U+0080~U+07FF C2 80~DF BF  2  
U+0800~U+FFFF E0 A0 80~EF BF BF 3  
 U+10000~U+10FFFF F0 90 80 80~F4 8F BF BF  4  


         ②1バイト目は16進数で00~7F・C0~FFを、2~4バイト目は 80~BFを使うことで、1バイト目と2バイト目以降が紛れないようにする。
            具体的には以下のように 特定のビットを固定するビット変換をおこなう  

Unicodeの2進数 UTF-8の2進数
0000 0000 0yyy zzzz     0yyy zzzz
0000 0uvv xxyy zzzz     110u vvxx 10yy zzzz
tttt uuvv xxyy zzzz     1110 tttt 10uu vvxx 10yy zzzz
rrss tttt uuvv xxyy zzzz     1111 00rr 10ss tttt 10uu vvxx 10yy zzzz
0001 0000 tttt uuvv xxyy zzzz     1111 0100 1000 tttt 10uu vvxx 10yy zzzz






   (2) UTF-16
       ・当初ユニコードはすべて2バイトであったが、現在は4バイトのもの一部もある。
       ・Windows XP,Vistaの内部処理に使用されている。


   (3) UTF-32
      <長所> 
         ・すべての文字が4バイトの固定長である。
         ・場合によってはデータの処理が簡単である。
      <短所> 
         ・すべての文字が4バイトとなり、英数字などきわめてCPUの処理効率が悪い


■ エンコーディングとエンディアン

     UTF-16とUTF-32には ビッグエンディアンとリトルエンディアンがある。 送信開始または途中でエンディアンを切り替える場合には文字の
   前にバイトオーダーマーク BOM(Byte Order Mark)と呼ばれる識別コードを挿入する。特にBOMがない場合は ビッグエンディアンとされる。
     尚、UTF-8には バイト単位でのデータ転送のためエンディアンの区別がない。

 エンコーディング   ビッグエンディアン   リトルエンディアン  バイトオーダーマーク
BOM
UTF-16 UTF-16 BE UTF-16 LE

BOM: FEFF
(例)
  LE → BE の場合
    FEFF 3093 306B 3061

BOM: FFFE
(例)
  BE → LE の場合
    FFFE 6B30 6130 6F30
UTF-32 UTF-32 BE UTF-32 LE

    




  ■ PCからの送信文字
    PCから送信されてくる文字は数値でもソースコード上”文字”か”数字”かによって送られてくるデータはことなります。
   順番としては以下となります。
     ・文字列は先頭から順番に1バイトづつ送られてくる。
     ・整数は下位バイトから上位バイトへと順番に1バイトづつ送られてくる。

   以下に、PCからPICへRS232Cで送られてくるデータをPIC側液晶に表示した例を紹介します。 
    ★ 液晶には1バイトのデータを文字 %Cで表示したものと、16進数 %Xで表示したものが2つ表示されています。
    ★ 0= 、 1= 、 2=、  3= はそれぞれ1番目、2番目、3番目、4番目にPICに送られてきたデータをあらわします。

//-------------------------------------------------------------------------------------------
(1)文字”a”の送受信
 
<PIC側受信プログラム部>
#INT_RDA
void rs232c()
{
        buf[0] = getc();
        lcd_clear();
        printf(lcd_data,"0=%c %x",buf[0],buf[0]);
}

 <PC側送信プログラム部>
char x = 'a'; sprintf(buf,"%c",x); szStr = &buf[0]; nNumberOfBytesToWrite = strlen(szStr); Ret = WriteFile( //データの送信 hPort, //  通信デバイスのハンドル:CreateFile()で取得したハンドルを指定 szStr,// 送信データのポインタを指定 nNumberOfBytesToWrite, //  送信するデータのバイト数を指定 &nNumberOfBytesWritten, // 実際に送信されたバイト数が格納されるポインタを指定 NULL //   通信とは関係ない引数なのでNULLを指定     );

//-----------------------------------------------------------------------------
(2)文字”2”の送受信
 
<PIC側受信プログラム部>
#INT_RDA
void rs232c()
{
        buf[0] = getc();
        lcd_clear();
        printf(lcd_data,"0=%c %x",buf[0],buf[0]);
}

 <PC側送信プログラム部>  
  int x = 2;

    sprintf(buf,"%d",x);
    szStr = &buf[0];
    nNumberOfBytesToWrite = strlen(szStr);


    Ret = WriteFile(    //データの送信
        hPort,          //  通信デバイスのハンドル:CreateFile()で取得したハンドルを指定
        szStr,// 送信データのポインタを指定
        nNumberOfBytesToWrite,  //  送信するデータのバイト数を指定
        &nNumberOfBytesWritten, //  実際に送信されたバイト数が格納されるポインタを指定
        NULL          //   通信とは関係ない引数なのでNULLを指定    
        );

//--------------------------------------------------------------------------------
(3)文字”59”の送受信
 
<PIC側受信プログラム部>
#INT_RDA
void rs232c()
{
        buf[0] = getc();
        lcd_clear();
        printf(lcd_data,"0=%c %x",buf[0],buf[0]);
}

<PC側送信プログラム部>
    int x = 59;

    sprintf(buf,"%d",x);
    szStr = &buf[0];
    nNumberOfBytesToWrite = strlen(szStr);


    Ret = WriteFile(    //データの送信
        hPort,          //  通信デバイスのハンドル:CreateFile()で取得したハンドルを指定
        szStr,// 送信データのポインタを指定
        nNumberOfBytesToWrite,  //  送信するデータのバイト数を指定
        &nNumberOfBytesWritten, //  実際に送信されたバイト数が格納されるポインタを指定
        NULL          //   通信とは関係ない引数なのでNULLを指定    
        );

//---------------------------------------------------------------------------
(4)文字”456”の送受信

<PIC側受信プログラム部>
#INT_RDA
void rs232c()
{
        buf[ix] = getc();

        if(ix >= 3)
        {
                lcd_clear();
                printf(lcd_data,"0=%c %x 1=%c %x",buf[0],buf[0],buf[1],buf[1]);
                lcd_cmd(0xC0);//2行目の先頭へ
                printf(lcd_data,"2=%c %x 3=%c %x",buf[2],buf[2],buf[3],buf[3]);
        
                ix = 0;
        }
        ix++;
}
<PC側送信プログラム部>
 int x = 456;

    sprintf(buf,"%d",x);
    szStr = &buf[0];
    nNumberOfBytesToWrite = strlen(szStr);


    Ret = WriteFile(    //データの送信
        hPort,          //  通信デバイスのハンドル:CreateFile()で取得したハンドルを指定
        szStr,// 送信データのポインタを指定
        nNumberOfBytesToWrite,  //  送信するデータのバイト数を指定
        &nNumberOfBytesWritten, //  実際に送信されたバイト数が格納されるポインタを指定
        NULL          //   通信とは関係ない引数なのでNULLを指定    
        );

//-----------------------------------------------------------------------------------
(5)文字”3456”の送受信

<PIC側受信プログラム部>
#INT_RDA
void rs232c()
{
        buf[ix] = getc();

        if(ix >= 3)
        {
                lcd_clear();
                printf(lcd_data,"0=%c %x 1=%c %x",buf[0],buf[0],buf[1],buf[1]);
                lcd_cmd(0xC0);//2行目の先頭へ
                printf(lcd_data,"2=%c %x 3=%c %x",buf[2],buf[2],buf[3],buf[3]);
        
                ix = 0;
        }
        ix++;
}
<PC側送信プログラム部>
int x = 3456;

    sprintf(buf,"%d",x);
    szStr = &buf[0];
    nNumberOfBytesToWrite = strlen(szStr);


    Ret = WriteFile(    //データの送信
        hPort,          //  通信デバイスのハンドル:CreateFile()で取得したハンドルを指定
        szStr,// 送信データのポインタを指定
        nNumberOfBytesToWrite,  //  送信するデータのバイト数を指定
        &nNumberOfBytesWritten, //  実際に送信されたバイト数が格納されるポインタを指定
        NULL          //   通信とは関係ない引数なのでNULLを指定    
        );
//--------------------------------------------------------------------------------------------
(6)整数”3456”の送受信

<PIC側受信プログラム部>
#INT_RDA
void rs232c()
{
        buf[ix] = getc();

        if(ix >= 3)
        {
                lcd_clear();
                printf(lcd_data,"0=%c %x 1=%c %x",buf[0],buf[0],buf[1],buf[1]);
                lcd_cmd(0xC0);//2行目の先頭へ
                printf(lcd_data,"2=%c %x 3=%c %x",buf[2],buf[2],buf[3],buf[3]);
        
                ix = 0;
        }
        ix++;
}
<PC側送信プログラム部>
    int x = 3456;
 
    Ret = WriteFile(    //データの送信
        hPort,          //  通信デバイスのハンドル:CreateFile()で取得したハンドルを指定
        &x,
        sizeof(int),
        &nNumberOfBytesWritten, //  実際に送信されたバイト数が格納されるポインタを指定
        NULL          //   通信とは関係ない引数なのでNULLを指定    
        );




  (注) 0x00000d80 = 0b00000000 00000000 00001101 1000000 = (2048 + 1024 + 256) + (128) = 3456
//---------------------------------------------------------------------------------------
  
 (6)ショート整数”3456”の送受信

<PIC側受信プログラム部>
#INT_RDA
void rs232c()
{
        buf[ix] = getc();

        if(ix >= 3)
        {
                lcd_clear();
                printf(lcd_data,"0=%c %x 1=%c %x",buf[0],buf[0],buf[1],buf[1]);
                lcd_cmd(0xC0);//2行目の先頭へ
                printf(lcd_data,"2=%c %x 3=%c %x",buf[2],buf[2],buf[3],buf[3]);
        
                ix = 0;
        }
        ix++;
}

<PC側送信プログラム部>
  short int x = 3456;
    Ret = WriteFile(    //データの送信
        hPort,          //  通信デバイスのハンドル:CreateFile()で取得したハンドルを指定
        &x,
        sizeof(int),
        &nNumberOfBytesWritten, //  実際に送信されたバイト数が格納されるポインタを指定
        NULL          //   通信とは関係ない引数なのでNULLを指定    
        );

//-----------------------------------------------------------------------------------
  
 (7)負の整数”3456”の送受信

<PIC側受信プログラム部>
#INT_RDA
void rs232c()
{
        buf[ix] = getc();

        if(ix >= 3)
        {
                lcd_clear();
                printf(lcd_data,"0=%c %x 1=%c %x",buf[0],buf[0],buf[1],buf[1]);
                lcd_cmd(0xC0);//2行目の先頭へ
                printf(lcd_data,"2=%c %x 3=%c %x",buf[2],buf[2],buf[3],buf[3]);
        
                ix = 0;
        }
        ix++;
}

<PC側送信プログラム部> 
  int x = -3456;
 
    Ret = WriteFile(    //データの送信
        hPort,          //  通信デバイスのハンドル:CreateFile()で取得したハンドルを指定
        &x,
        sizeof(int),
        &nNumberOfBytesWritten, //  実際に送信されたバイト数が格納されるポインタを指定
        NULL          //   通信とは関係ない引数なのでNULLを指定    
        );


//-------------------------------------------------------------------------------------------
 (8)負のショート整数”3456”の送受信

<PIC側受信プログラム部>
#INT_RDA
void rs232c()
{
        buf[ix] = getc();

        if(ix >= 3)
        {
                lcd_clear();
                printf(lcd_data,"0=%c %x 1=%c %x",buf[0],buf[0],buf[1],buf[1]);
                lcd_cmd(0xC0);//2行目の先頭へ
                printf(lcd_data,"2=%c %x 3=%c %x",buf[2],buf[2],buf[3],buf[3]);
        
                ix = 0;
        }
        ix++;
}

<PC側送信プログラム部> 
    short int x = -3456;

    Ret = WriteFile(    //データの送信
        hPort,          //  通信デバイスのハンドル:CreateFile()で取得したハンドルを指定
        &x,
        sizeof(int),
        &nNumberOfBytesWritten, //  実際に送信されたバイト数が格納されるポインタを指定
        NULL          //   通信とは関係ない引数なのでNULLを指定    
        );

//---------------------------------------------------------------------------------------------
 (9)文字列”abcd”の送受信

<PIC側受信プログラム部>
#INT_RDA
void rs232c()
{
        buf[ix] = getc();

        if(ix >= 3)
        {
                lcd_clear();
                printf(lcd_data,"0=%c %x 1=%c %x",buf[0],buf[0],buf[1],buf[1]);
                lcd_cmd(0xC0);//2行目の先頭へ
                printf(lcd_data,"2=%c %x 3=%c %x",buf[2],buf[2],buf[3],buf[3]);
        
                ix = 0;
        }
        ix++;
}

<PC側送信プログラム部> 
    sprintf(buf,"abcd");
    szStr = &buf[0];
    nNumberOfBytesToWrite = strlen(szStr);

    Ret = WriteFile(    //データの送信
        hPort,          //  通信デバイスのハンドル:CreateFile()で取得したハンドルを指定
        szStr,// 送信データのポインタを指定
        nNumberOfBytesToWrite,  //  送信するデータのバイト数を指定
        &nNumberOfBytesWritten, //  実際に送信されたバイト数が格納されるポインタを指定
        NULL          //   通信とは関係ない引数なのでNULLを指定    
        );


//----------------------------------------------------------------------------------------------

■ フォント
 ■ 分類
   1. データ形式による分類
     1.1 ビットマップフォント
          ・  ドットの組み合わせで文字を表現したフォント
          ・  ラスターフォント などとも呼ばれる
        1.1.1. ビットマップフォント
             ・Windowsで使われるフォント
        1.1.2. 丸漢フォント
             ・ Macintosh で使われるフォント
        1.1.3. BDF
             ・ UNIXで使われるフォント
             ・ Glyph Bitmap Distribution Format の略である。
   

     1.2 スケーラブルフォン 
         ・ 線の位置や形、長さなどで文字の形を表現したフォント
       1.2.1. ストロークフォント 
            ・ 線の太さのないフォント
            ・ CADなどで見かける
            ・ 表示速度が速い

       1.2.2. アウトラインフォント
            ・ 太さのあるフォント
            ・ 袋文字フォント などとも呼ばれる
            ・ 現在のPCで最もよくつかわれている
         1.2.2.1 TrueTypeフォント
            ・ アップルコンピュータとマイクロソフトが共同開発したアウトラインフォントで、ビットマップフォントを埋め込むことも可能である。
            ・ Windows 、Macintoshで使われているフォント
            ・ 2次スプライン曲線で制御が行われている。
         1.2.2.1 PostScriptフォント
            ・ アドビシステムズが開発したアウトラインフォントである。
            ・ Macintosh で使われているフォント
            ・ 3次べジェ曲線で制御が行われている。
            ・ 印刷業界でよく使われている。


   2. フォント幅による分類
     2.1 等幅フォント
         ・ 文字の字の幅が一定のフォント
     2.2 プロポーショナルフォント
         ・ 文字の幅が文字により違うフォント


  ■ フォントの拡張子
        

      PC      拡張子 名称 備考
Windows ttf TrueTypeフォント Windows標準のアウトラインフォント
otf
オープンタイプフォント アウトラインフォント
ttc TrueType Collection アウトラインフォント
fon ビットマップタイプ Windows標準のビットマップフォント
fnt M.U.G.E.N  ビットマップフォン
Macintosh         


 ■ JIS漢字 フォントグリフ
   ・01区~94区まである。
   ・各区には最大94文字のフォントデータが格納される。番号何点と呼ばれる。 (例)"神"はJIS漢字の区点番号が "32区31点" の漢字である。
   ・ 漢字がは "亜"から始まり、JIS漢字コードは 0x3021である。      
   ・実際には文字データがないものでもグリフデータはあるものとしてグリフデータのオフセット位置は計算する。
   ・通常グリフデータはコード順に 0x2121 から 0x747e まで, ベタに書きこまれている。