Delphi Programming / Object Pascal
サイトのトップページへ リンクのページへ ロゴマーク
[掲載 2023年10月19日] [更新 2024年07月14日]* Delphi 一般・その他 [未分類 - OS の操作等]
環境依存文字チェッカー
動作確認等 Windows 10 ビルド 19043 Pro 64 bit
Google Chrome 124, Microsoft Edge 124, Firefox 125
[整理番号 - 1912]







01_環境依存文字チェッカー


以前、環境依存文字についての記事を書きました。そこで、ウエブページ上で使用できる環境依存文字のチェッカーを作成してみました。
環境依存文字は、以下の 3 番目のリンクに掲載しているツールでもチェック可能です。



使用方法は単純です。ボタンの下の入力欄に文字を入力して [チェック] ボタンをクリックします。環境依存文字は、背景に色が付いた文字になります。
コピーと貼り付けは、プレーンテキスト形式 (書式なしテキスト) になるようにしています。タブ文字はなくなります。この入力エリアではタブ文字は入力できません。

文字数は、改行文字を含まない文字数です。
改行は、[Shift] + [Enter] キー操作で挿入してください。





以下は、実際の実行例です。
チェック可能な文字数は 3 万字程度と思ってください。文字数が多いと、応答しなくなり、このページがフリーズすることがあります。フリーズした場合は、[Win] + [Ctrl] + [Shift] + [B] のキー操作を試してみてください。このキー操作は描画をリセットします。





[備考 1]
Firefox は、バージョン 125 未満では正常に動作しません。

[備考 2]
Checker のように末尾が er の用語は、日本語で表記する場合、長音記号を使用しないで「チェッカ」とするのが一般的です。

[備考 3]
文字の挿入操作では、キャレット (カーソル) 位置の文字の属性か適用されます。これは一般的なワープロソフトの仕様と同じです。一般的なワープロソフトでは、フォント名も適用されます。デフォルトの属性の文字から矢印キーでキャレットを移動して挿入すると、その属性での挿入ができます。




02_同じ字形の環境依存文字


下表の [基底文字] は異体字セレクタを使用しない文字です。右の 3 つは異体字セレクタを使用している文字です。異体字セレクタを使用する文字は環境依存文字です。この表の異体字セレクタ付きの文字は、専用のフォントを使用しないとと正しく表示することはできません。
異体字セレクタを使用している文字であるかは、上の参考リンクのツールで確認できます。



基底文字 異体字セレクタ付きの文字
IPAmj明朝 Yu Gothic UI (同じ字形)
朝󠄂 朝󠄃 朝󠄄 朝󠄂 朝󠄃 朝󠄄


上の異体字セレクタを使用する異体字は、専用のフォントを使用して描画しないと、環境依存文字の区別がつきません。

次の、~ 〜 ~ の内、2 番目と 3 番目の文字も、字形では環境依存文字との区別が付かない文字の例です。この文字は、全角チルダ / 波ダッシュ問題と言われている文字です。
いずれの文字も「から」を変換して入力できます。半角のチルダは、日本語 IME が OFF の状態で [Shift] + [^] ( [Back Space] [\] キーの左) のキー操作で入力できます。


文字 UCS 判定
~ U+007E チルダ (半角)。非環境依存文字
U+301C 波ダッシュ (全角)。環境依存文字
U+FF5E 全角チルダ。非環境依存文字


半角の円記号も、非環境依存文字と環境依存文字があります。日本語のフォントでは、半角のバックスラッシュは表示できません。これは、円記号問題と言われています。
全角の円記号とバックスラッシュはどちらも非環境依存文字です。


欧文フォント 日本語フォント UCS 備考
\ \ U+005C 半角。非環境依存文字
パス名 (ディレクトリ名) の区切り文字
[¥] キーで入力。[\] キーで入力しても同じ
欧文フォントではバックスラッシュになる
¥ ¥ U+00A5 半角。環境依存文字
日本語における円記号としての文字
「えん」を変換して入力。[環境依存] の ¥ を選択
[¥] キーで入力すると、自動的に U+005C になる
U+FF3C 全角。非環境依存文字
「すらっしゅ」を変換して入力
U+FFE5 全角。非環境依存文字
「えん」を変換して入力。[全] の ¥ を選択


以下のハイフン、ダッシュ、長音記号なども、区別が付きにくいことがあります。
結合用の U+0332 は、例えば Windows 10 のメモ帳で、A に続いてこの文字を入力するとアンダーライン付きの A になります。


文字 UCS 判定
- U+002D ハイフン‐マイナス。非環境依存文字
_ U+005F アンダースコア (アンダーライン)。非環境依存文字
U+2010 ハイフン (余白付き)。非環境依存文字
U+2011 改行しないハイフン。環境依存文字
U+2013 EN ダッシュ。環境依存文字
U+2014 EM ダッシュ。環境依存文字
U+2015 水平バー (引用ダッシュ)。非環境依存文字
U+2212 全角のマイナス。非環境依存文字
U+30FC カタカナ・ひらがな長音。非環境依存文字
U+FE58 小さい EM ダッシュ。環境依存文字
U+FFE63 小さいハイフン - マイナス。環境依存文字
U+FF0D 全角ハイフン。非環境依存文字
_ U+FF3F 全角のアンダーライン。非環境依存文字
U+FF70 半角カタカナ長音。環境依存文字
̲ U+0332 結合用のアンダーライン。HTML では無効。環境依存文字


Unicode には、一般的な文字の他に、康煕部首と CJK 部首補助という領域 (ブロック) に、部首文字だけが登録されています。これらの文字は全て環境依存文字です。一般的な文字と字形が同じ、あるいは似ています。



康煕部首の文字 (環境依存文字) ⼥ ⽉ ⽏ ⽗ ⽜ ⾁ ⾧ ⾳ ⾼ ⾺
一般的な文字 (非環境依存文字) 女 月 毋 父 牛 肉 長 音 高 馬


[備考 1]
空白文字 (スペース文字) にもいくつかの種類がありますが、U+0020 の半角空白文字と U+3000 の全角空白文字以外の空白文字は全て環境依存文字です。

[備考 2]
環境依存文字には、Windows 10 の Microsoft IME の再変換の機能を利用しても、非環境依存文字に変換できない文字があります。

[備考 3]
ucs は Universal Multiple-Octet Coded Character Set (国際符号化文字集合) の略です。これは、Unicode のコードポイントのことです。




03_環境依存文字チェックの処理手順
KankyoIzon_Checker_Sample.zip [391 KB] 2024年07月17日版
ローカル環境で利用可能。encoding.js-master.zip 同梱。説明ファイルなし
今ここで動作確認


今回作成した環境依存文字チェッカーの処理手順の説明です。
このプログラムは javaScript を使用して作成しています。実際には、環境依存文字ではない文字であるかを調べて、そうではない文字を環境依存文字としています。
文字コードの変換には encoding.js というライブラリを利用しています。



環境に依存しない文字は、ASCII 文字と JIS X 0208 の文字です。JIS X 0208 の文字は ISO-2022-JP として符号化されています。これは、元々、日本語のインターネットメール (電子メール) で使用する文字を制定するための文字符号化方式の規格です。この文字符号化方式による文字コードのことを JIS コードと言います。
本ツールは、この JIS コードを使用して JIS X 0208 の文字であるかを判定します。


まず、文字列の Unicode のコードポイント (文字コード) を文字単位で全て配列に格納します。その配列要素内のコードポイントが 1 つだけの要素を JIS コードに変換しながらチェックしていきます。複数のコードポイントで構成されている文字は、環境依存文字です。このチェックは必要ありません。

もし、ISO-2022-JP で規定している文字であれば、Unicode のコードポイントを JIS コードに変換すると、複数バイトのバイト列が取得できます。文字「粟」の場合は以下のようになります。30 40 がコード表に掲載されているJIS コードです。コンピュータの内部ではこのようなバイトデータとなります。その前後はエスケープシーケンスと呼ばれている値です。
JIS コードの前のエスケープシーケンスが 1B 24 42 の時が環境に依存しない文字候補です。




// 文字 粟 の JIS コードのバイト列。3040 が JIS コード
1B 24 42 30 40 1B 28 42



JIS X 0213 にも、このエスケープシーケンスの文字があります。
そこで、JIS コードから JIS の区点の「区」の値を計算して、区の値を kuno とした以下の条件の文字を環境に依存しない文字とします。それ以外を環境依存文字として処理しています。

JIS コードの上位バイトから 0x20 を減算すれば区の値です。文字「粟」の場合、0x30 - 0x20 = 16 なので 16 区の文字です。




(kuno <= 8 || (kuno >= 16 && kuno <= 84))



encoding.js は、上の参考リンクのページ上部左端の [code] をクリックして表示されたページの [code] をクリックして ZIP 書庫をダウンロードしました。その中身を、筆者が利用してているレンタルサーバに置いて使用しています。<head> 部を参考にしてください。以下のようになっています。赤の下線部分は、encoding.js 関係ファイルを置いているサーバでのディレクトリです。相対ディレクトリで記述しています。



<script type="text/javascript" src=" ../../cssjs/enc/encoding.js"></script>、




[備考]
Javascript では UTF-16 で文字を扱います。非環境依存文字は 2 バイトの文字です。UTF-16 では、ASCII 文字も 2 バイト文字です。2 バイト文字のコードポイント (文字コード) は、16 進数で 4 桁です。
4 バイトの文字であるサロゲートペアの文字 (コードポイントは 16 進数で 5 桁) も、結合文字も、異体字セレクタを使用する文字も、Emoji の文字も全て環境依存文字です。

本サンプルでは、2 バイト文字だけに対して JIS コードをチェックしています。





04_環境依存文字の代替え文字


環境依存文字を、非環境依存文字に置き替える際の参考です。

半角カタカナは、全角カタカナにすれば非環境依存文字となります。前項で提供している HTML コードでは、以下のようなコードを追加すると自動的に処理できます。
濁点、半濁点付きの半角カタカナを、全角カタカナと同じように 1 文字分として配列に格納します。格納の順番は、全角カタカナのコードポイント順とします。その配列から、対象の半角カタカナの位置を取得します。



      // 半角カナを全角カナに変換
      // hanarray は半角カナを格納した配列 ( 格納順は全角カタカナ文字と同じ順番 )
      //  char が結果の全角文字
      
      var hanidx = hanarray.indexOf(char);
      if (hanidx >= 0) {
        var code = hanidx + 0x30A1;
        char = String.fromCodePoint(code);
      }


この半角カタカナ文字の配列を使用すると、全角カナを半角カナに変換できます。ただし、半角がないカナ文字があります。半角カナの小文字は、以下の 9 文字だけです。
1 行目の最後の ヮ ヵ ヶ は小文字です。


半角がないカナ文字 ヰ ヱ ヲ ヷ ヸ ヹ ヺ ヽ ヾ ヮ ヵ ヶ
全角カナ小文字 ァ ィ ゥ ェ ォ ャ ュ ョ ッ ヮ ヵ ヶ
半角カナ小文字 ァ ィ ゥ ェ ォ ャ ュ ョ ッ


ひらがなとカタカナのコードポイントは、以下に掲載している文字コード表で確認できます。



Microsoft IME では、下図のキー操作で、半角と全角のカタカナの相互変換ができます。



図1
カタカナの半角と全角の変換
  • 対象のカタカナ文字を選択
  • [変換] キーを押す
  • [F7] キーを押すと全角になる
  • [F8] キーを押すと半角になる
  • [F6] キーを押すとひらがなになる

異体字セレクタ付きの文字から、異体字セレクタの部分を削除する例です。
異体字セレクタを削除して、基底文字だけにしても、それが非環境依存文字になるとは限りません。異体字セレクタ付きの文字には、エレメント数が 4 つの文字がありますが、それらは、基底文字だけにしても非環境依存文字にはなりません。



      //  異体字セレクタを除いた文字にする
      //  charlen は各文字のエレメント数 ( 1 エレメントは 2 バイト )
      //  charlen が 4 の時は基底文字がサロゲートペア (4 バイト - 32 ビット) の文字
      //  サロゲートペアの文字は環境依存文字なので処理不要

      if (charlen == 3 && char[1].codePointAt(0) == 0xDB40) {
        char = char[0];
        charlen = 1;
      }


全角の英数字は環境依存文字ではありませんが、以下のような処理で半角文字に変換できます。
同じ方法で、ひらがなとカタカナの相互変換も可能です。




      //  全角の英数字と記号を半角に変換
      //  code は 2 バイト文字のコードポイント
      //  char が結果の半角文字

      if (code >= 0xFF01 && code <= 0xFF5E) {
        code = code - 0xFEE0;
        char = String.fromCodePoint(code);
      }


U+F900 ~ U+FAFF は CJK 互換漢字と呼ばれている領域です。それらは通常は使用しないコードポイントの文字ですが、環境依存文字である 晴 礼 神 﨑 などの異体字が登録されています。代替え文字を設定する意味があるかも知れません。



漢字の代替え文字は必ずあるとは限りません。漢字の代替え文字は、意味が同じで字形が異なる文字、つまり、異体字をを使用することになります。たとえ、異体字があっても、それが非環境依存文字ではない場合もあります。以下は代替え文字の例です。最後の「彅 (なぎ)」には、代替となる文字はありません。



東文研の異体字リストの文字は全て 2 バイト文字です。サロゲートペアの文字はありません。[検索文字] の行数は 16,596 行あります (2024年05月09日現在)。


環境依存文字 髙 﨑 增 﨔 橫 瀨 昻 羽 神 社 鷗 幷 塡
代替え文字 高 崎 増 欅 横 瀬 昂 羽 神 社 鴎 并 填

環境依存文字 賴 靑 鶴 黑 俱 剝 吞 頰 黃 𠮷 𠮟 葛󠄀 彅
代替え文字 頼 青 鶴 黒 倶 剥 呑 頬 黄 吉 叱 葛 -


以下の異体字の内、3 番目の「夁」は環境依存文字です。代替文字として「一」を使用することができます。しかし、日本は漢字文化の国です。必ずしも「一」が適切とは限りません。例えば、10,000 円札は「壱万円」と印刷されています。
2 行目の文字は、3 番目以降か環境依存文字です。この文字の場合であれば 1 番目の文字を代替え文字としてもいいでしょう。同じ漢字でも、文章、文脈のどこで使われるかによっても意味が異なる場合があります。「本」という漢字 1 文字だと書籍類を思い浮かべることがありますが、「基本」や「本音」の「本」が語源に近い意味です。漢字の置き換えは単純ではありません。

康煕部首の文字や CJK 互換漢字などは、ユニコードコンソーシアムが公開している資料に基づいて、全部ではありませんが非環境依存文字に変換できます。それ以外の環境依存文字の漢字は、そのような基準がありません。個別に対応することになります。



「いち」の異体字 一 壱 壹 弌
「かいこ」の異体字 蚕 蠶 蝅 蠺 䗝 䗞 䘉


Unicode には多くの記号文字や絵文字が登録されていますが、非環境依存文字の記号類は、JIS X 0208 の非漢字の文字だけです。
以下は、それ以外の環境依存文字の代替え文字の例です。



記号・絵文字の例 代替え文字 代替え文字の補足
① ② ③ ㊿ (1) (2) (3) (50) 全て半角文字
⑴ ⑵ ⑶ ⒇ (1) (2) (3) (20) 全て半角文字
⒈ ⒉ ⒊ ⒛ 1. 2. 3. 20. 全て半角文字
Ⅰ Ⅱ Ⅲ Ⅳ Ⅸ I II III IV IX 全て半角文字
㈪ ㈫ ㈬ ㈱ ㈳ (月) (火) (水) (株) (社) ( ) は半角文字
Ⓒ Ⓡ ㊊ ㊋ ㊖ ㊙ (C) (R) (月) (火) (財) (秘) ( ) C R は半角文字
㎞ ㎝ ㎧ ㎐ ㎓ km cm m/s Hz GHz 全て半角文字
㎡ ㎦ 平方メートル 立方キロメートル カタカナは全角文字
㌫ ㍻ ㋿ ㍿ パーセント 平成 令和 株式会社 カタカナは全角文字


丸囲み数字のコードポイントは連続していることがあります。このような場合は、コードポイントの値を利用して、上の表のような代替え文字に変換することができます。



      //  丸囲み数字の代替え文字への変換例
      //  1 文字単位でコードポイントを判定して処理
      //  U+2460 - U+2473 の場合
      //  結果の dsttext は (1) (2) (3) となる

    var dsttext = "";
    var text = "① ② ③";
    var textcnt = text.length;
     
    for (i = 0; i < textcnt; i++) {     
      var code = text[i].codePointAt(0);        
      if (code >= 0x2460 && code <= 0x2473) {
        dsttext += "(" + String(code - 0x2460 + 1) + ")";
      } else {
        dsttext += text[i];
      }
    }



複数の文字を含んだ文字は、Unicode の正規化メソッド normalize を使用すると、分解した文字にすることができます。
ローマ数字も、アルファベットの I, V, X, i, v, x を使用する文字になります。



      // 複数の文字が 1 つになっている文字
      // 正規化の normalize メソッドで分解できる文字もある
      // 結果の text は パーセント 昭和 平成 (株) (代) となる

    var text = "㌫ ㍼ ㍻ ㈱ ㈹";
    text = text.normalize("NFKC");



丸囲み文字で正規化メソッド normalize を使用すると、丸の中の文字だけになります。



      // 正規化の normalize メソッドでは丸囲み文字は中の文字だけになる
      // 結果の text は 5 6 7 上 中 下 となる

    var text = "⑤ ⑥ ⑦ ㊤ ㊥ ㊦";
    text = text.normalize("NFKC");



半角カタカナは、正規化すると全角のカタカナになります。全角の英数字は半角の英数字に変換されます。結合文字を正規化すると、結合した文字と同じ字形の文字が登録されている場合、その文字に置き換わります。例えば、結合文字の ヴ (U+30A6 u+3099) は (U+30F4) になります。結合文字は環境依存文字です。
正規化によって、字形が異なる別の文字 (異体字) に置き換わる漢字があります。


ウェブには、環境依存文字関係の文字を表形式で掲載しているページがあります。以下は、それらの文字をコピーして利用する際の参考記事です。



[備考]
本項で説明している変換用のコードは、前項で提供している HTML コードに記述しています。ただし、コメントにしています。提供しているツールは、環境依存文字をチェックするツールですので、変換処理は無効にしています。
必要であれば、メインルーチンの以下の部分の先頭の、コメントを意味する // を削除して利用してください。HTML ファイルはテキストファイルです。Windows では、メモ帳で編集できます。漢字は、基本的に手作業での修正となります。参考リンクの [環境依存文字の代替え文字候補 : 一覧と検索] で、ある程度は代替え文字を見つけることができるかも知れません。

    // srcstr = convertchar(srcstr);

代替文字変換機能を今ここで動作確認






05_文字のページ内検索におけるブラウザによる違い


ページ内検索は、[Ctrl] + [F] で検索ダイアログまたは検索バーを表示して、閲覧中の記事の文字や文字列を検索するウェブブラウザの機能です。

ページ内検索で ヴ (U+30A6 u+3099) を検索すると、Google Chrome 124、Microsoft Edge 124 では、ヴ (U+30A6 u+3099)、 (U+30F4)、 を検索します。Firefox 125 でば、ヴ (U+30A6 u+3099) だけしか検索しません。

康煕部首、CJK 部首補助、CJK 互換漢字、CJK 互換漢字補助の文字も、Google Chrome 124、Microsoft Edge 124 では、元の文字と一般的な文字の両方を検索しますが、Firefox 125 でばどちらか一方しか検索しません。

異体字セレクタ付きの文字の場合は、Google Chrome 124、Microsoft Edge 124 では、基底文字が同じであれば全て検索しますが、Firefox 125 でば、異体字セレクタが異なる文字は検索しません。


Google Chrome 124 と Microsoft Edge 124 は、正規化後の文字と正規化前の文字の両方を検索します。Firefox 125 ば、コードポイントが異なる文字を検索しません。ただし、半角チルダと全角チルダは区別なしで検索します。これは、Google Chrome 124 も Microsoft Edge 124 でも同じです。
Firefox 125 の場合ば、[発音区別符号を区別] をチェックすると、半角チルダと全角チルダを区別します。



図2
Google Chrome 124 のページ内検索
  • ブラウザの右上
  • 次の検索は [F3]
  • 前方検索は [Shift] + [F3]
  • × は [閉じる]

 

図3
Microsoft Edge 124 のページ内検索
  • ブラウザの右上
  • 次の検索は [F3]
  • 前方検索は [Shift] + [F3]
  • × は [閉じる]

Firefox 125 では、ブラウザの左下が検索する文字の入力部です。下図では 2 行になっていますが、実際には 1 行です。
この図は、本ページの、濁点を結合した「ウ」を検索した結果です。上の図の Google Chrome と Microsoft Edge では 8 件となっていますが、Firefox では 4 件となっています。



図4
Firefox 125 のページ内健作
  • ブラウザの左下
  • 実際は 1行
  • [閉じる] は、右下の ×

[備考]
検索ダイアログまたは検索バーを閉じれば、検索結果のクリアとなります。[F5] でページを再読み込みしても検索結果をクリアできます。