last updated:2023/12/27

←前へ 次へ→
機能別Q&A 質問番号順Q&A


[HMM0073A]

●文字列をバイト単位ではなく文字単位で扱う

Q.
「strlen」等の文字列操作関数はバイト単位となっていますが、文字単位で扱うことはできないでしょうか?1バイト文字と2バイト文字が混在している時に、とても困ります。

A.

秀丸エディタ Ver.8以降は、文字列をUnicode(UTF-16LE)として扱う関数群が追加されています。

  • wcslen
  • wcsleftstr
  • wcsrightstr
  • wcsmidstr
  • wcsstrstr
  • wcsstrrstr

この関数群を使用すれば、半角 全角問わずに文字単位で、文字列を操作可能です。

ただし、UTF-16LE(16bit 0x0000 to 0xFFFF)なので、コードポイントが U+10000 を越えるとサロゲートペアを使って表現する必要がある為、上記関数群でも、1文字でも2文字扱いになります。

Unicode(UTF-16LE)ベースで文字単位で扱うには、

  • サロゲートペア
  • 結合文字列(基底文字 + 結合文字)
  • 異字体セレクタ(文字 + 異字体セレクタ(SVS:U+FE00 to U+FE0F、IVS:U+E0100 to U+E01EF))

等があるので、全て考慮しようとするとかなり難しい事になります。

秀丸エディタ Ver.9以降は、「UCS-4単位」「秀丸単位(カーソル移動)」「書記素クラスター単位」で文字列操作する関数も追加されています。詳細はマクロヘルプの文字の単位を参照してください。「書記素クラスター単位」は「Windows 10 Version 1903 以降」のみ動作するとの事。


←前へ 次へ→
機能別Q&A 質問番号順Q&A