画像ファイル
画像ファイル Unicode入門
VB.NET C#全般
1羊の皮を着た狼 VB.NET
2Form1、Form2の相互参照
3Form1、Form2の相互参照 2
4VB.NET C# データ型の基本
5VB.NET C# 文字列
6VB.NET タイマー精度
7BackgroundWorkerの魅力1..
8BackgroundWorkerの魅力2..
9VB6のタイマー
10コントロールの配列をインデクサ..
11コントロールの配列はジェネリク..
12インデクサ(C#、VB.NET)
13インデクサでBit操作
14Unicode 入門
15デリゲート入門
16マルチスレッド入門
17イベント入門
18デリゲートとイベント
18インターフェースの基本

RichTextBox関係
1RichTextBoxの不思議
2テキスト色付け高速化計画
3VB.NET RichTextBox1
4VB.NET RichTextBox 2

RS-232C関係
1RS-232Cの基礎
2RS-232Cの何が変わった..
3SerialPortクラス
4Unicode(ユニコード)の壁
5マルチスレッドの壁
6RS-232C サンプルコード
7RS-232CのHEXモニタ
8RS-232C 送信モジュール
9RS-232Cのループテスト
10RS-232Cのピンチェンジ..

Socket通信
1C#、VB2005 でSocket通信
2サーバー 複数接続

プロセス間通信
1プロセス間通信(送信側)
2プロセス間通信(受信側)


質問、意見はこちらに
画像ファイル

メモ帳とUnicode
『メモ帳』に何か書き込み、「名前を付けて保存(A)」をプルダウンメニューから選択すると
保存ダイアログボックスが出てくる、このダイアログボックスの一番下の文字コードの
選択ボタンを押してみると、
「ANSI」
「Unicode」
「Unicode big endian」
「UTF-8」
の4つの選択コンボボックスが開く。
この4つの違いについて調べてみよう。
先ず「abcABC」の6文字を『メモ帳』に書き込みこれを4つのモードで保存して、
保存したデータをバイト配列に読み込んで、読み込んだ順番にバイト配列を表示してみる。
ここで使用したコードはC#、VB.NETの両方のコードで下に表示しているので参考にしていただきたい。
ここでの「「ABC」は大文字のABCでは無く、いわゆる大文字の2バイト文字のABCで有る。

「ANSI」
「ANSI」で保存したデータは
61-62-63-82-60-82-61-82-62
と保存されている。
基本的にANSIはいわゆるアルファベットと数字、記号であり、この保存方法はShift-Jisであろう。
Shift-Jis(code page 932)はANSIコードに2バイトの漢字コードを加えた物で、アルファベット等の256文字は
ANSIと同じである。
61は16進法で表された「a」のアスキーコードである「-」は単なる表示上の区切りマークで書き込まれている訳ではない。
数字の61はc言語では「0x61」VBでは「&H61」となり、10進法では97となる。
82-60は「A」、82-61は「B」、82-62は「C」である。

ちなみにWindows 95はShift-Jisが標準で使われていました。
「Unicode」
FF-FE-61-00-62-00-63-00-21-FF-22-FF-23-FF
と保存されている、「FF-FE」は『BOM』と呼ばれるヘッダーである。
『メモ帳』のUnicodeと呼ばれる物は『UTF-16』でBMP (基本多言語面)を16ビット、
その他をサロゲートペアという仕組みを使い32ビットで指定する方式である。
WindowsXp以降のOSはこの方式が使われている。
「a」は「61-00」と2バイトで記録されている。
「A」は「21-FF」、「B」は「22-FF」、「C」は「23-FF」と記録される。
「61-00」と「00」が先に来ているのは『リトル・エンディアン』と呼ばれるデータをメモリー上に配置する
方式で、低い桁が先に配置される、PCは主にこの方法で配置される。
この反対に「00-61」と大きい桁から配置される方法も有る。
この方法が3番目の「Unicode big endian」である。

「Unicode big endian」
FE-FF-00-61-00-62-00-63-FF-21-FF-22-FF-23
と保存されている。
頭の2倍とのBOMを見ると、「FF-FE」、「FE,FF」と区別されていることがわかる。

「UTF-8」
最後の「UTF-8」であるが、これもUnicodeと呼ばれるので注意されたい。
これは、
EF-BB-BF-61-62-63-EF-BC-A1-EF-BC-A2-EF-BC-A3
となっている。
「EF-BB-BF」がBOMである、UTFの場合はANSIの上位互換であり、
ANSIの場合は256文字を1バイトで表すが、UTF-8の場合はこれに加えて
漢字などは3バイトで保存される。
「abc」は「61-62-63」とANSIと同じであるが、
「A」は「EF-BC-A1」、「B」は「EF-BC-A2」、「C」は「EF-BC-A3」と3バイトで記録される。
インターネットではこの形式が一般的であり、IEなどの設定でUnicodeといえばUTF-8である。
FraneworkのStreamは何も指定しなければ、UTF-8で文字を吐き出しので注意が必要で有る。
これは漢字3バイト、英数字1バイトと言う英語圏優位の方式である。(?)

使用したコード
C#、VB.NETともに、フォームに textBox1(TextBox1)とbutton1(Button1)を貼り付ける。
更にopenFileDialog1(OpenFileDialog1)を貼り付ける。
テキストボックスのMulutilineをTrueにしておく。
なおファイルの読み書きにはusing(Using)を使用すべきところであるが、コードを見やすくする為と
usingに慣れていない人の為に本コードではusingを使用していないので了解されたし。
C#のコード

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO;
namespace NotePadRead
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
//ファイルの選択ダイアログ
openFileDialog1.ShowDialog();

//選択されたファイル名
string fileName= openFileDialog1.FileName;

//ストリームによるファイルの読み込み
FileStream sr = new FileStream(fileName, FileMode.Open,
FileAccess.Read);
//バイト配列の定義
byte[] bytes = new byte[sr.Length];
//バイト配列に読み込む
sr.Read(bytes, 0, bytes.Length);
sr.Close();
//バイト配列を文字列に変換
string strByte = BitConverter.ToString(bytes);
textBox1.Text = strByte;
}
}
}

VB.NETのコード
Option Strict On
Imports System.io
Public Class Form1
Private Sub Button1_Click( ByVal sender As _
System.Object, ByVal e As System.EventArgs) Handles Button1.Click
OpenFileDialog1.ShowDialog()
Dim fileName As String = OpenFileDialog1.FileName
'ストリームによるファイルの読み込み
Dim sr As FileStream = New FileStream(fileName, _
FileMode.Open, FileAccess.Read)
'バイト配列の定義
Dim bytes(CInt(sr.Length)) As Byte
'//バイト配列に読み込む
sr.Read(bytes, 0, bytes.Length)
sr.Close()
'バイト配列を文字列に変換
Dim strByte As String = BitConverter.ToString(bytes)
TextBox1.Text = strByte
End Sub
End Class
画像ファイル