ひゃまだのblog

ひゃまだ(id:hymd3a)の趣味のブログ

文字列の全角半角を考慮して文字幅を数える

(2020-04-11 初稿 - 2021-05-05 再転記 - 2021-11-15 修正)

はじめに

文字列もフォントによっては、カーニングがあってそもそも揃わないが、等幅フォントで表示したときに全角と半角を考慮して文字幅を数えたいと思ったので、簡単なBash スクリプトを作成した。まあ、気休め程度に。^^;

なお、ここではUTF8の環境で、wcコマンドがある前提です。

 

ちなみに、文字数は以下のコマンドで得ることができる。

$ str="12345"
$ echo ${#str}
5

作成したシェルスクリプト

以下に示すスクリプトをzenhan_len等とし、chmod +x zenhan_lenで実行権を付与する。

IsZenkakuは、全角と半角を区別するが、以下のとおり判定している。

wc -cで3byteの文字種のうち、uFF61からuFF9Fを半角カタカナ(一部記号を含む)と判断。

Zenhan_lenは、IsZenkaku関数を用いて、文字の幅を合計する。

strにテストする様々な文字を入力して実行して確認を。

$ cat zenhan_len

IsZenkaku(){
  local result=false
  if [ $(echo -n $1 | wc -c) -gt 2 ]; then
  if  $1 < $'\uFF61'  ||  $1 > $'\uFF9F' ; then
    result=true
  fi

  echo $result
}

Zenhan_len(){
  local charbyte=0
  for((cnt=0; cnt < ${#1}; cnt++)); do
    char=${1:$cnt:1}
    if $(IsZenkaku $char); then
      #echo $char
      ((charbyte+=1))
    fi
    ((charbyte+=1))
  done

  echo $charbyte
}

str="aあ1aア1ウ"                              # ここを修正してテスト

num=$(Zenhan_len $str)
echo "文字のバイト数:" $num

おわりに

EUCのときには、とても簡単だったが、UTFになってからかなり手こずった。

もっとも、冒頭に述べたとおり等幅フォントを用いるとき以外には効果はない… (^^ゞ

 

なお、複数行を一括して列幅を揃える場合には、columnコマンドを使った方法が便利。

(参考ページ)

関連ページ