■ 文字コード                                                         
   ・ アスキーコード、JIS標準文字コード(JIS 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漢字コード2

  文字集合に係る主なJIS    
  
日本産業規格
(JIS) 
初版 通称 内容 備考
JIS X 0201
 → 一覧
1969年 ANK文字 ASCIIの第8ビットのb7=1の領域にカタカナが配置されている。 ASCIIのバックスラッシュ ('\') の替わりに円記号 ('¥') が、チルダ ('~') の替わりにオーバーライン ('‾') が割り当てられている。
JIS X 0208
 → 一覧
1990年 JIS基本漢字
・ 非漢字、第1・第2水準漢字、 ASCIIは含まず
・ 第1水準漢字: 通常の文書であればJIS第1水準の文字だけで記述できるとされている。2965字
・ 第2水準漢字: 第1水準よりも使用頻度の低いもので、地名や人名、旧字体他。3388字
・ 第1、第2水準漢字は、このJIS X 0208で定義されている。 
 
JIS X 0212
 → 一覧
1990年 JIS補助漢字 ・ 非漢字 、補助漢字(0208との重複なし)
・ 国文学研究資料館の書誌データベース構築における研究成果に基づいた文字選定を行っており、学問研究向きの文字集合となっている。
JIS X 0213
 → 一覧
2000年 JIS拡張漢字 ・ 非漢字(0208を包含)、第1・第2水準漢字(0208と同じ)に第3・第4水準漢字を加えたものである。但し、JIS補助漢字は含まない。
・ 第3水準漢字: 業種によって必要になる特殊な記号、漢字など  1,259字
・ 第4水準漢字: 更に追加された、業種によって必要になる特殊な記号、漢字など 2,436字
・ 第3、第4水準漢字は、このJIS X 0213で定義されている。
JIS X 0213はJIS X 0208を包含し更に第三・第四水準漢字などを加えた上位集合である。  
JIS X 0221 1995年 CJK統合漢字
→ 一覧
・ 国際規格であるISO/IEC 10646(Unicode)の翻訳
・ 国際符号化文字集合(Unicode、0208・0212・0213の文字を全て含む
・ 中国、韓国、ベトナムなどの漢字、記号も含む
ISO/IEC 10646(Unicode)の翻訳
   


   


 ■ シフトJIS → 一覧

     MS-DOSの時代にできた『符号化方式』で、JIS X 0201(ANK文字)を1バイトで、JIS X 0208(第1水準漢字、第2水準漢字)を2バイトで符号化する可変幅文字符号化方式。 2バイト文字は、第1バイトに0x81-0x9Fまたは0xE0-0xEFの47通り、第2バイトに0x40-0x7Eまたは0x80-0xFCの188通りを用いる。
 下記の長所①②③と云った点から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        




      ・ シフトJIS記号の読み方 


■ ISO/IEC 10646

  ・ ISO/IEC 10646 (UCS; 英: Universal Coded Character Set) は、符号化文字集合や文字符号化方式などを定めた、文字コードの国際標準のひとつで、業界規格のUnicodeと概ね互換である。日本の対応規格はJIS X 0221(国際符号化文字集合)。     
  ・ この規格は制定の一歩手前の段階までは、現在の姿とはかなり異なる仕様だった。 1990年に国際標準の一歩前の段階のDIS (Draft International Standard) として作成されたが、1991年6月の投票で否決された。その理由は、同じ時期にアメリカの企業群がUnicode仕様を作成したため、同じ目的の規格が2つ作られることを避けることだった。その後、DIS 10646とUnicodeとを一本化する作業が行われた。    

■ JIS X 0221

  ・ ISO/IEC 10646の国際一致規格である。 規格の名称は「国際符号化文字集合 (UCS)」    
     

■ ユニコード   

 要約

<特徴>
 ・ 符号化文字集合や文字符号化方式などを定めた、文字コードの業界標準規格である。 国際規格 ISO/IEC 10646と概ね互換である。
 ・ 一つの文字に対して、全世界で重複のない、ユニークな文字コードが設定されている。
 ・ Unicode(ユニコード)は、符号化文字集合や文字符号化方式などを定めた、文字コードの業界標準規格。
 ・ 国際規格のISO/IEC 10646とUnicode規格は同じ文字コード表になるように協調して策定されている。
 ・ JIS漢字の第一 ~ 第四水準のすべての漢字は CJK統合漢字 すなわち、ユニコードに登録されている。


<歴史・現在> 現時点(2023年.5月)のユニコード(Ver.15 → URL) 、 最新Unicode →  http://www.unicode.org/versions/latest/.    
 ・ ゼロックス、マイクロソフト、IBM、サンマイクロシステムなどがUnicodコンソーシアムをつくり開発を進めた。
 ・ 現時点(2023年)では、Unicode 第15.0.0 版  ISO/IEC 10646:2022  収録文字数:143,924 語

<文字サイズ>
  ・ 当初、16ビット(2バイト)に世界の文字を収めることで始まった。 2バイトには入りきらないので 32ビット(4バイト)にする案の時期もあったが、最終的に  21ビットとなった。
21ビットの文字サイズでは、コンピュータでは扱いにくいので、コンピュータで扱いやすいバイト列に変換(文字符号化CES: Character Encoding Scheme)して利用することとなった。
  21ビット、すなわち 0x000000 ~0x10FFFF の中に世界の全文字が収録されている。
   → (Unicode符号化文字集合のU+0000〜U+10FFFFの各符号位置に、Unicodeスカラ値という非負整数値を対応付けている)
   
・ 2バイト(65536文字)の収納領域を面と呼び、17面の構成となっている。 特殊な文字を除き、BMP(基本多言語面)と呼ばれる面の中に世界で日常使用される文字が入っている。  

<構成> 
  Unicode 15.0 ( 2023年現在)    
    ・ ユニコード一覧 → URL
    ・ 文字のスカラー値を検索 or スカラー値から文字を検索 → URL
 
Unicodeスカラ値の範囲 文字 文字数
(個)
説明 備考
0000〜 FFFF 第0面 55,503 基本多言語面
(BMP)
Basic Multilingual Plane
詳細参照 → URL
10000〜 1FFFF 第1面 22,279 追加多言語面
(SMP)
Supplementary Multilingual Plane
古代ギリシャ文字、古代ペルシャ文字など
20000〜 2FFFF 第2面 60,866 追加漢字面
(SIP)
Supplementary Ideographic Plane
CJK漢字で古代などの特殊な漢字が収録されている
30000〜 3FFFF 第3面 4,939 第3漢字面
(TIP)
Tertiary Ideographic Plane
第2面に入りきらなっかたCJK漢字
40000〜 4FFFF 第4面   未使用・用途未定  
50000〜 5FFFF 第5面   未使用・用途未定  
60000〜 6FFFF 第6面   未使用・用途未定  
70000〜 7FFFF 第7面   未使用・用途未定  
80000〜 8FFFF 第8面   未使用・用途未定  
90000〜 9FFFF 第9面   未使用・用途未定  
A0000〜 AFFFF 第10面   未使用・用途未定  
B0000〜 BFFFF 第11面   未使用・用途未定  
C0000〜 CFFFF 第12面   未使用・用途未定  
D0000〜 DFFFF 第13面   未使用・用途未定  
E0000〜 EFFFF 第14面 337 追加特殊用途面
SSP)
Supplementary Special‐purpose Plane
F0000〜 FFFFF 第15面   私用面  
100000〜10FFFF 第16面   私用面  
  小計 143,924    
   
   

  

         


   <日本語>
     ・ 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

     

     <私用領域、私用文字、私用面>
  Unicodeでは、当事者間の私的な合意によって文字(外字)を定義できる私用領域 (英: Private Use Area, PUA)が用意されている。規格としては、この範囲にいかなる文字も規定していない。私用領域の内容を定義するものとしては、ISOやユニコードコンソーシアム以外の個人、組織およびソフトウェアベンダが想定されている。私用領域に定義された文字を私用文字という。私用領域としては、基本多言語面のU+E000–U+F8FF (57344–63743) と第15面および第16面 (U+F0000–U+10FFFF) が用意されている。このうち、私用領域だけに使われる面(すなわち、第15面と第16面)を私用面という。


サロゲートペア

 <サロゲートペア概要>    
  ・  「1文字=2バイト」の基本は維持しつつ、一部の文字については「1文字=4バイト」にする方法です。
・ 未使用の2バイト+2バイト で4バイトの文字コードを設定し、文字コード数不足に対応することとなった。 この4バイトの文字はサロゲート文字と命名された。 また2つの2バイトのペアはサロゲートペアと命名された。
・ サロゲート文字の漢字は 第2面(追加漢字面と呼ばれる) 及び第3面の 65536文字スペースの中に収録されています。 下図参照
  ・ サロゲートペア(Surrogate Pair:代理ペア)と呼ばれる予備バイトを使用した2バイトのペアをBMP(Basic Multilingual Plane)面に 1,048,576(=1024×1024)個つくり各ペアに1個の文字を割り当て不足分に割り当てる方式が採用されている。この結果、4バイトの文字が出現してしまうこととなったが 1,112,064(= 256×256 - 1024×2 + 1024×1024)個の文字にUnicodeコードを割り当てることができるようになった。 
  ・ サロゲート文字の文字コードには、BMPと関連する4バイト(32ビット)の文字コードと スカラー値と呼ばれる21ビットの文字コードがある。 2つの文字コードには関係式が決められている。
  ・ UTF-8にサロゲートペアはありません。
   
<サロゲート文字の上位バイト、及び下位バイト値>
      具体的には、従来のUnicodeでは未使用のだったBMPの 0xD800~0xDBFF(1024通り)を「上位サロゲート」、0xDC00~0xDFFF(1024通り)を「下位サロゲート」と規定し、「上位サロゲート+下位サロゲート」の4バイトで文字を表現する方法です。
 「上位サロゲート」も「下位サロゲート」も従来のUnicodeでは未使用の領域なので、以前のUnicodeの文字コードと重複することはありません。

 サロゲート文字(4バイト)の構成:

 サロゲート文字(4バイト) = 
 上位サロゲートの2バイト + 下位サロゲートの2バイト =
 (0xD800~0xDBFF) + (0xDC00~0xDFFF) 


 下図参照
 
     
 
 
上位バイト
0000

D7FF
D800

DBFF
DC00

FFFF
下位バイト 0000

DBFF
     
DC00

DFFF
     
E000

FFFF
     
     
     部がサロゲート文字となる 
     
   
<サロゲートペアと21ビットの文字コードの関係>
 ① 21ビットスカラー文字コードから、サロゲートペアへの変換
   1.  文字コードから0x10000を引いて1番左の桁を"2"から"1"にする。これをXとする。
   2. Xを0x400で割ってその商を0xD800に足す。これを「上位サロゲート」とする。
   3. Xを0x400で割ってその剰余を0xDC00に足す。これを「下位サロゲート」とする。
   4. 上位サロゲート、下位サロゲートの順番で出力する。

 ② サロゲートペアから、21ビットスカラー文字コードへの変換
    上位バイトから0xD800を減算したものに0x400を掛けたものと、下位バイトから0xDC00を減算したものを加算する。
   この加算結果に0x10000を加算する。
     
   ★ 21ビットスカラー化演算は、上記文字位置図の     のオフセットを0にする演算です。
     
プログラム例
(C言語)
 
   
#include <stdio.h>

int main()
{
	//U + 2000B の場合
	int InData = 0x2000B;		//21ビットサロゲート文字コード
	int OutData;
	int Upper;	//上位サロゲートバイト
	int Lower;	//下位サロゲートバイト
	int temp;

	printf("Data ScalarValue = %X\n\n", InData);

	//スカラーコード → サロゲートペア 変換
	temp = InData - 0x10000;	//
	Upper = temp / 0x400 + 0xD800;	//
	Lower = temp % 0x400 + 0xDC00;	//

	printf("Convert to Surrogate Pair!!\n");
	printf("(Upper,Lower) = (0x%X, 0x%X)\n\n",Upper,Lower);	//サロゲートペア

	//サロゲートペア → スカラーコード 変換
	OutData = ((Upper - 0xD800) * 0x400 + (Lower - 0xDC00) ) + 0x10000;

	printf("Convert to ScalarValue!!\n");
	printf("ScalarValue = 0x%X",OutData);	//スカラーコード

	return 0;
}

結果
(by Eclipse)
Data ScalarValue = 2000B

Convert to Surrogate Pair!!
(Upper,Lower) = (0xD840, 0xDC0B)

Convert to ScalarValue!!
ScalarValue = 0x2000B 

 


  (例) 実際のサロゲート文字
   
   
   




■ ユニコード と 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水準漢字  日常生活で使われることはほとんどない漢字  

■ CJK統合漢字(CJK unified ideographs)          

中国語、日本語、朝鮮語、ベトナム語で使用されているの中で漢字(表意文字)のなかで、ユニコードに採用されている漢字。 各漢字に符号が設定されている。
CJK統合漢字 Unicode 15.0(2022年) → 一覧

面  範囲 名称 字数
第0面
基本多言語面
(BMP)
U+4E00 - U+9FFF CJK Unified Ideographs 20,992
U+3400 - U+4DBF CJK Unified Ideographs Extension A 6,592
第2面
追加多言語面
(SIP)
U+20000 - U+2A6DF CJK Unified Ideographs Extension B 42,720
U+2A700 - U+2B738 CJK Unified Ideographs Extension C 4,154
U+2B740 - U+2B81D CJK Unified Ideographs Extension D 222
U+2B820 - U+2CEA1 CJK Unified Ideographs Extension E 5,762
U+2CEB0 - U+2EBE0 CJK Unified Ideographs Extension F 7,473
 第3面
漢字面
(TIP)
U+30000 - U+3134A CJK Unified Ideographs Extension G 4,939
U+31350 - U+323AF CJK Unified Ideographs Extension H 4,193
  合計 97,058



■ 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

 文字符号化方式 (CES: Character Encoding Scheme)

   文字符号化方式とは、 符号化文字集合で文字に対応付けた非負整数値を、実際にコンピュータが利用できるデータ列(通常、バイト列)に変換する符号化の方式である。
コンピュータや通信の分野では、データをシリアルのバイト列に変換すること、またはその変換規則を「エンコーディング」と呼ぶ。
   
  ■ 主なエンコーディングスキーム     
  (例)
略称 内容 備考 
UTF-8  8ビット (エンディアンはなし)  Webページの95%で使用されているとのデータがある
UTF-16BE 16ビット、ビッグエンディアン  
UTF-16BL 16ビット、リトルエンディアン
UTF-32BE 32ビット、ビッグエンディアン  
UTF-32BL 32ビット、リトルエンディアン  
ISO-2022-JP 7ビットのみを用いる1バイト文字集合2バイト文字集合をエスケープシーケンスを利用して切り替えて使用する符号化方式である。 e-mail等 インターネットなどのグローバルな環境で日本語を使用する場合に使用されている
Shift-JIS JIS X 0201(ANK文字)を1バイトで、JIS X 0208(第1水準漢字、第2水準漢字)を2バイトで符号化する可変幅文字符号化方式。 2バイト文字は、第1バイトに0x81-0x9Fまたは0xE0-0xEFの47通り、第2バイトに0x40-0x7Eまたは0x80-0xFCの188通りを用いる Windowsのファイルシステム やCPUリソースの小さいマイコンなどで用いられる
     
   
       
   Encodeの意味    
 
    Encodeと云う英語は、「信号やデータを一定の規則に基づいて変換する」という意味です。ASCⅡができたころは、「符号化文字集合」と「文字符号化方式」の区別はありませんでした。 「文字符号化方式」(Character Encoding Scheme)と云う概念ができた現在でも Encodeの意味を区別がされだした以前の意味で使っている場合もあります。
 (例)統合開発環境Harmonyに於けるEncoding の一覧 → URL
   
   
   
 
  
   
   

■ UTF-8、UFF-16、UTF32
   (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-8(Unicode Transformation Format)   → 「UTF-8コード(BMP面)一覧

 ■ 概要
   UTF-8は、符号化文字集合Unicodeの各文字のCode point(スカラー値)を 8ビット(1バイト)単位(Code unit と呼ぶ)の1バイトから4バイトの可変長バイト列に変換します。 5–6バイトの表現は、ISO/IEC 10646による定義とIETFによるかつての定義で、Unicodeの範囲外を符号化するためにのみ使用する。 Unicodeによる定義とIETFによる最新の定義では、5–6バイトの表現は不正なシーケンスである。
    UTF-8は、Unicodeで定義された符号化文字集合をバイト列に変換する方式の一つです。ASCIIコードと互換性をもたせた規格となっているので、多くのソフトウェアで使われています。 Webサイトで用いられる文字エンコーディングで, Unicode規格であるUTF-8が全体の96.7%を占めています
  UTF-8の最初の128文字は、ASCIIとまったく同じです。ASCII文字は1バイトで表現されますが、漢字や仮名文字は3バイト、もしくは4で表現されるので、データサイズはUTF-16(2バイト表現)より大きくなります。
     
 ■ Unicode → UTF-8 変換方法
   
(1)Unicodeの符号位置(コードポイント)からの範囲1~範囲4を選択する。      
符号位置(16進) UTF-8のビット列(2進) 備考 
範囲1 U+0000 - U+007F 0xxx xxxx ASCII文字
範囲2 U+0080 - U+07FF 110x xxxx 10xx xxxx 欧州、中東文字、記号他
範囲3 U+0800 - U+FFFF 1110 xxxx 10xx xxxx 10xx xxxx 漢字、ハングル他
範囲4 U+10000 - U+10FFFF 1111 0xxx 10xx xxxx 10xx xxxx 10xx xxxx サロゲート漢字、古代文字他

(2)Unicodeの符号位置(16進数)を 2進数に変換する。
(3)2進数を以下の一覧表に示す所要の位置に配置する。UTF-8のビット列(2進)のxにUnicodeの符号のビット列を当てはめた値がUTF-8の値となる。
   尚、下記表の中にある z0 z1 z2 z3などは、16進数Zのビット0、ビット1、ビット2、ビット3の値を表す。

   
  符号位置
(16進数)
符号位置とUTF-8の16進数の関係 UTF-8のビット列(2進数) UTF-8の
16進数


1
U+0000
 -
U+007F
U+00YZ 0xYZ //16進数
 ↓UTF-8変換
0by2y1y0 z3z2z1z0 //2進
0〇〇〇 △△△△  
0y2y1y0 z3z2z1z0
(例) a
U+0061
0x61 //16進数
 ↓UTF-8変換
0b0110 0001//2進数
0110 0001 61


2
U+0080
 -
U+07FF
U+0WYZ  0xWYZ //16進数
 ↓UTF-8変換
0b110w2 w1w0y3y2 10y1y0 z3z2z1z0 
110□ □□〇〇 10〇〇 △△△△  
110w2 w1w0y3y2 10y1y0 z3z2z1z0   
(例)β
U+03B2
0x3B2 //16進数
 ↓UTF-8変換
0b1100 1110 1011 0010 //2進数
1100 1110 1011 0010  CE B2 


3
U+0800
 -
U+FFFF
U+VWYZ 0xVWYZ //16進数
 ↓UTF-8変換
0b1110 v3v2v1v0 10w3w2 w1w0y3y2
           10y1y0 z3z2z1z0
//2進数 
1110 ◎◎◎◎ 10□□ □□〇〇
10〇〇 △△△△
 
1110 v3v2v1v0 10w3w2 w1w0y3y2
10y1y0 z3z2z1z0
 
(例) 東
U+6771
0x6771 //16進数
 ↓UTF-8変換
0b1110 0110 1001 1101 1011 0001 //2進数
 1110 0110 1001 1101
1011
0001
E6 9D B1 


4
U+10000
 -
U+10FFFF
U+
 TVWYZ
0xSTVWYZ //16進数
 ↓UTF-8変換
0b1111 0s0t3t2 10t1t0 v3v2v1v0
       10
w3w2 1w0y3y2
10y1y0 z3z2z1z0 //2進数
1111 0◇◇ 10◇◇ ◎◎◎◎ 
10□□ □□〇〇 10〇〇 △△△△
 
1111 0s0t3t2 10t1t0 v3v2v1v0 
10w3w2 w1w0y3y2 10y1y0 z3z2z1z0
 
(例)
U+
20E6D
0x020E6D //16進数
 ↓UTF-8変換
0b1111 0000 1010 0000
        10
11 1001
1010 1101//2進数
1111 0000 1010 0000
1011 1001
1010 1101 
F0 A0 B9 AD

 ■ UTF-8 のバイト列 メモ  
   符号化されたバイト列は、バイト順に関わらず左から順に出力する。
   1バイト目の先頭の連続するビット "1"(その後にビット "0" が1つ付く)の個数で、その文字のバイト数がわかるようになっている。
すなわち、
 任意のバイトの先頭ビットが
   "0" の場合は1バイト文字、
  "110" の場合は2バイト文字の先頭バイト、
  "1110" の場合は3バイト文字の先頭バイト、
  "11110" の場合は4バイト文字の先頭バイト
     であると判定できる。
   2バイト目以降はビットパターン "10" で始まり、1バイト目と2バイト目以降では値の範囲が重ならないので、文字境界を確実に判定できる。
範囲1 U+0000 - U+007F 0xxx xxxx
範囲2 U+0080 - U+07FF 110x xxxx 10xx xxxx
範囲3 U+0800 - U+FFFF 1110 xxxx 10xx xxxx 10xx xxxx
範囲4 U+10000 - U+10FFFF 1111 0xxx 10xx xxxx 10xx xxxx 10xx xxxx
   


 ■ エンディアン

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

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

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



 


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

     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

■ エスケープシーケンス (escape sequence)

   ・ エスケープシーケンスとは、画面上に文字を出力する際に、文字そのものを出力するのではなく、文字色の変更やカーソルの移動、文字の消去、文字集合の切り替えなど、文字出力の制御を行う特殊な文字列のことである。
  ・ エスケープシーケンス とは、コンピュータシステムにおいて、通常の文字列では表せない特殊な文字や機能を、規定された特別な文字の並びにより表したもの。
  ・ エスケープシーケンスの先頭には、エスケープ文字、エスケープコードと呼ばれる文字やコードによって表される。 通常、何がエスケープ文字であるか、またはそうでないかは、前後関係に依存する。

 (例) エスケープ文字: \     
      
\r 同じ行の先頭に戻る C言語文字列リテラルに於ける文字出力制御   
\n 改行、復帰 
\a ベル吹鳴
\b 1行戻る

     エスケープコード: ESC
      
ESC 2/8 4/2 (ESC ( B)   US-ASCIIをG0に指示する  ISO/IEC 2022 (JIS X 0202) における文字集合の指示・呼び出しのシーケンス 
ESC 2/4 4/2 (ESC $ B) JIS X 0208をG0に指示する

   

 


  ■ 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
オープンタイプフォント アウトラインフォント
TrueTypeフォントとPostScriptフォントの技術を統合して作られた新しいフォント形式
ttc TrueType Collection アウトラインフォント
fon ビットマップタイプ Windows標準のビットマップフォント
fnt M.U.G.E.N  ビットマップフォン
Macintosh         


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

 ■  サンセリフ フォント    
    サンセリフ(仏: Sans-serif)とは、セリフのない書体 (フォント) の総称である。セリフとは、文字の線の端につけられる線・飾りで、「うろこ」、「ひげ飾り」、「ひげ」とも呼ばれる。    
     
       
 ■  Noto Sans(読み方:ノトサン)    
    世界中の言語をサポートすることを目標にGoogleがadobeと共同開発したフォントシリーズのサンセリフバージョン。