ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

sed/awkコミュのgawk 3.1.5 で文字列のバイト数を得る

  • mixiチェック
  • このエントリーをはてなブックマークに追加
gawk 3.1.5 では length("あああ") は 3 を返しますが、純粋にバイト数 (EUC-JP の場合なら 6) を返すような関数ってありますか?

jgawk 時代には length() と jlength() を使ったスクリプトを作っていました。

また、index() などでも同様の区別をさせることって可能でしょうか?

コメント(10)

ないと思います。

3.1.4の時代の実装なら、jlength相当のものをsplitを使って
自分で定義するようなこともできたんですが、逆はできない
ですからね。

jindex、jsubstrもsplit使って定義してました。

ところで文字数ではなくバイト数が必要な場面て
出力の成形がらみですか?
データベースにCSV等を流し込む際に、フィールド毎のバイト数を計測するときに使うかな。
hoge:~$ gawk 'BEGIN{print length("あああ")}'
3
hoge:~$ LANG=C gawk 'BEGIN{print length("あああ")}'
6
>>3
それだと一つのプログラムの中でバイト数と文字数を
求めたいときに困りませんか?

正規表現マッチングもバイト指向になっちゃうし。
ほげむたさん、ありがとうございます。理由は整形がらみなんですが、私も jlength を定義していた派でした。

ょさん、見てくれていたんですね。(^^;
ブログを先に見たので、「これ、私の質問?」とか思っていました。
LANG だと 1 つのスクリプトで使い分けるのが厳しいです。

バイト数は文字数のカウントコマンド (wc とか) でカウントさせて戻すという荒技くらいしか思いつかないです。
これこそ、欧米人のアジア言語圏に対する認識であり、我々がアピールしなかった結果なのでしょう。
単一スクリプト内で文字数とバイト数を同時に扱うことはできないのですから、もうそれは gawk の出る幕じゃなく、 perl や ruby とかを使うしかないのでしょう。
awk はテキスト処理に特化しつつ、少ない関数で手軽に処理できる反面、多言語を扱うのは厳しいということですかね。
Perlでも、use encoding しているとき(=処理がバイト単位でなくキャラクタ単位のとき)に文字列のバイト長を求めるのは
面倒なんですけど(できなくはない)。

Rubyは逆にキャラクタ単位の長さを求めるのに一手間
必要だったりします。

まあスクリプティング言語に限らずPOSIXの規格も
マルチバイトキャラクタには冷たいですね。

で、キャラクタ単位の長さとは別にバイト単位の長さを
求める手段が必要であるならそれは必要だと思う人が
アピールするべきであるというのは賛成です。
unicodeがからむと、より面倒な事態に……。
MacOS9向けのファイル名を生成するときにバイト単位の計算が必要でしたね。

ログインすると、みんなのコメントがもっと見れるよ

mixiユーザー
ログインしてコメントしよう!

sed/awk 更新情報

sed/awkのメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。

人気コミュニティランキング