喫茶XRAYトップページ


[13622] 区点コードで文字をに入力返信 削除
2023/5/1 (月) 18:19:13 Mr.XRAY
以下の記事を追加しました.

[ 区点コードによる文字入力と関連 JIS 規格 ]
http://mrxray.on.coocan.jp/Delphi/Others/JIS_KuTem.htm

実を言うと「区点コードで文字を入力したい」
というのが,どういうことなのかよく分かりません.
取り合えず,これでご容赦を.
連休中もお仕事でしょうか.お疲れ様です.


[13623] 文字コードの作成返信 削除
2023/5/1 (月) 18:27:12 Mr.XRAY
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.


[13624] 質問がちょっと違う気がする返信 削除
2023/5/3 (水) 21:26:09 Mr.XRAY
読みが分からない漢字があった.
辞書でしらべて読みが分かった.
第 1 水準の漢字表を見て区点コードが分かった.
( 第 1 水準の漢字は音読み順になっている )
面倒なので,効率よく区点コードで漢字を入力したい.

それが,どうして「区点コードで漢字を入力する方法」
の質問になるのかは謎ですが・・・
単に,読みが分からない漢字の検索,入力方法のような気がするのですが・・・

折角掲載した記事なので,そのまま掲載しておきます.


[13625] Re:質問がちょっと違う気がする返信 削除
2023/5/6 (土) 19:05:41 Mr.XRAY
てなわけで,以下を追加しました.

[ 04_漢字の区点コードを調べる / 区点コードの漢字を調べる ]
http://mrxray.on.coocan.jp/Delphi/Others/JIS_KuTem.htm#04

後出しなんてのは,掲示板ではよくあることなのですが,
少しばかりムカついています.


INCM/CMT
Cyclamen v3.82