Delphi 使いの方への参考です.
ウェブページに掲載している文字コード表は,
以下のようなコードを作成して使用しています.
このコードで保存した MojiTable.html をダブルクリックしてブラウザで表示 すると,
とりあえずは,文字コード表を表示できます.
CSS で体裁を整えます.
unit Unit1;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes,
Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ExtCtrls, Vcl.StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
private
{ Private 宣言 }
public
{ Public 宣言 }
end;
var
Form1: TForm1;
implementation
uses
MECSUtils;
{$R *.dfm}
//=============================================================================
// 区点コードの漢字表の HTML コード作成
// これは JIS X 0212 の補助漢字の 16 区の漢字の例
// EUC-JP 使用
// ネット上で見かけるの EUC の値とは違うので注意
// 本サンプルの EUC は,Windows の EUC-JP (コードページ 20932 ) における値
// 全ての区点の区で EUC-JP の値が連続しているわけではない
//
// EUC-JP のコードポイントが 2 バイトと仮定した処理
// Shift_JIS のコード表作成にも応用可能
// Unicode の 16 進 4 桁 ( 2 バイト), 5 桁 (サロゲートペア) にも応用可能
//
// uses に MECSUtils;が必要
//=============================================================================
procedure TForm1.Button1Click(Sender: TObject);
const
// Shift_JIS, Unicode の時は各々 16, 16 の倍数
LColCnt : Integer = 10;
LRowCnt : Integer = 10;
type
EUCString = type AnsiString(20932); // EUC-JP
var
LMojiBytes : TMemoryStream;
LMojiCodeList : TStringList;
LHtmlCodeList : TStringList;
LKuNo : Integer;
LFirstCode : Integer;
LFinalCode : Integer;
LBytes : array[0..3] of Byte;
LRow : Integer;
LCol : Integer;
LCode : Integer;
Lucs4Text : UCS4String;
LText : string;
LIndex : Integer;
begin
LKuNo := 16;
LFirstCode := $B020;
LFinalCode := LFirstCode + 99;
LMojiBytes := TMemoryStream.Create;
LHtmlCodeList := TStringList.Create;
LMojiCodeList := TStringList.Create;
try
// 対象の文字のバイトデータを全て改行付きでメモリに格納
for LIndex := LFirstCode to LFinalCode do begin
LBytes[0] := (LIndex and $FF00) shr 8;
LBytes[1] := (LIndex and $00FF);
LBytes[2] := $0D;
LBytes[3] := $0A;
LMojiBytes.Write(LBytes[0], Length(LBytes));
end;
// メモリに格納したバイトデータを TStingList に読み込む
LMojiBytes.Position := 0;
LMojiCodeList.LoadFromStream(LMojiBytes, TEncoding.GetEncoding(20932));
// タイトル行
LHtmlCodeList.Add(' <br>');
LHtmlCodeList.Add(' <table>');
LHtmlCodeList.Add(' <tbody>');
LHtmlCodeList.Add(' <tr>');
LHtmlCodeList.Add('<td width="30">' + '区' + '</td>');
LHtmlCodeList.Add('<td width="30">' + '点' + '</td>');
for LCol := 0 to LColCnt - 1 do begin
LText := IntToHex(LCol, 1);
LHtmlCodeList.Add('<td width="30">' + LText + '</td>');
end;
LHtmlCodeList.Add(' </tr>');
// 行単位じ各 tr タグと td タグのコードを生成
LIndex := 0;
for LRow := 0 to LColCnt - 1 do begin
if LIndex > (LColCnt * LRowCnt) then Break;
LHtmlCodeList.Add(' <tr>');
if LRow = 0 then begin
// Shfit_JIS, Unicdoe などのコード表作成の場合は不要
LHtmlCodeList.Add('<td rowspan="10" valign="top" width="30">' + IntToStr(LKuNo) + '</td>');
end;
for LCol := 0 to LColCnt do begin
if LCol = 0 then begin
// 点の 10 進数で最初の値 (表の左から 2 番目の列)
// Shift_JIS, Unicode の時はここを変更
LText := FormatFloat('0#', LRow * LColCnt);
LHtmlCodeList.Add('<td width="30">' + LText +'</td>');
end else begin
// 各文字の文字参照の値
// Unicode の 5 桁のコードポイントも処理可能なように UTF-32 に変換
// サロゲートペアだと HTML の文字参照で正常表示できない文字がある
LText := LMojiCodeList[LIndex];
Lucs4Text := MECSUtils.UTF16ToUTF32(LText);
LCode := Lucs4Text[0];
if (LCode = $30FB) or (LCode > LFinalCode) then begin
LText := '';
end else begin
LText := '&#x' + IntToHex(LCode, 4) + ';';
end;
LHtmlCodeList.Add('<td width="30">' + LText +'</td>');
Inc(LIndex);
end;
end;
LHtmlCodeList.Add(' </tr>');
end;
LHtmlCodeList.Add(' </tbody>');
LHtmlCodeList.Add(' </table>');
LHtmlCodeList.SaveToFile('MojiTable.html', TEncoding.UTF8);
finally
FreeAndNil(LHtmlCodeList);
FreeAndNil(LMojiCodeList);
FreeAndNil(LMojiBytes);
end;
end;
end.
|