「ソースコードは 1 行あたり 80 文字以内」とか「コミットログは横幅 72 文字以内」とか、文字数に関するルールはいろいろある。 ルールを徹底するには機械的に判定したい。と思って、簡単なスクリプトを書こうとした瞬間、意外と「1 行あたりの文字数」をカウントするのが難しいことに気付いた。 たとえば、「あA」は「全角 1 文字+半角 1 文字」なので半角 3 文字分としてカウントしたい。 しかし、UTF-8 の世界では「あA」の文字長は 2 だし、バイト数は 4 (あ=0xE38182、a=0x41) である。 EUC-JP や Shift-JIS の時代なら、単純に「あA」は 3 バイトなので「半角 3 つ分」とすぐ分かったのだけども… (逆に文字長を調べるのが面倒だった)。 はて、どうするか? というのがこの記事でいいたいこと。 East Asian Width を見よ いろいろとググ
2013-12-21 東アジア文字幅問題との戦いの記録 こんにちは。ブログを始めて2日目になる wacky です。この記事は KMC アドベントカレンダー 2013 の 21 日目の記事です。昨日の記事は uiureo さんの ChatPad での会話は簡単に盗聴される でした。今回の記事のタイトルは、「ambiguousな文字幅が2で、256色表示で、罫線がちゃんと表示されるtmux」の予定でしたが、色々書いてるうちに変えたくなったので、変えることにしました。 東アジア文字幅問題とは KMC のアドベントカレンダーをたどってこの記事を見ている人の中には、クライアントとして何らかの Unix を動かしていて、一日のほとんどを端末(とブラウザと mikutter )の上で過ごす人が多いと思います。自分もその一人です。さて、端末の上で、○や☆などの文字幅が Ambiguous な文字を打つと
UnicodeのEast Asian Width (東アジアの文字幅)特性を扱うgemを書いた。CPANの Unicode::EastAsianWidth, Text::VisualWIdth::PP, Text::UnicodeTable::Simpleの機能をマージしたようなものになってる。文字特性のデータはUnicode仕様書から自動生成している。 https://rubygems.org/gems/visual_width ターミナルにさくっとテーブルを書きたいときは日本語でもくずれないので便利かも。 # VisualWidth::Table require 'visual_width/table' t = VisualWidth::Table.new( style: [ { align: :center, width: 10 }, { align: :center, width:
Text::VisualWidth::PP といえば、文字の幅が1文字幅か2文字幅かを判別してうまいことなにかやりたいときに便利なライブラリとして Perl 界では有名ですね。 このモジュール、もとはといえば mobirc を pure perl 化しようとしたときに Text::VisualWidth::XS の PP 版がなくてこまった!! っていう現象がおきたときに、つくったものなんですね。そんなモジュールが他でもつかわれるとは不思議なものです。 さて、そんな Text::VisualWidth::PP ですが、Songmu さんのブログで BEGIN { $Unicode::EastAsianWidth::EastAsian = 1; } をつかっていろいろがんばってる様子がのっておりまして、どうも、これは、楽をするためのモジュールであるはずの Text::VisualWidth:
前回のRubyのソースでは、ASCII文字と半角カナかどうかを半角文字の判定に使用していた。今回はPythonと同様に、Unicodeの定義から判定できるようにクラスを作成した。 ついでに右寄せと中央寄せも追加した。 Singletonで最初に使用したときに、Unicode定義ファイルを読み込む。 定義リストの検索は2分探索で行う。 実行には以下のURLにある EastAsianWidth.txt が必要。 http://www.unicode.org/reports/tr41/ http://www.unicode.org/Public/UNIDATA/EastAsianWidth.txt 追記: 速度が遅かったためbsearchから文字列処理を外に出して高速化 Ruby 1.8.6 unicodedata.rb require "singleton" # UnicodeDataクラス(
文字幅ってどうやって調べるんだろって思って、 使えるモジュールを探してみた。 #!/usr/bin/env perl use strict; use warnings; use utf8; my $str = "リンゴゴリラ"; { use Unicode::Japanese; printf "[%s] length = %d\n", 'Unicode::Japanese', Unicode::Japanese->new($str)->strlen; } { use Text::VisualWidth::UTF8; printf "[%s] length = %d\n", 'Text::VisualWidth', Text::VisualWidth::UTF8::width($str); } { use Unicode::EastAsianWidth; my $count_length
この記事には複数の問題があります。改善やノートページでの議論にご協力ください。 出典がまったく示されていないか不十分です。内容に関する文献や情報源が必要です。(2017年4月) 独自研究が含まれているおそれがあります。(2017年4月) 出典検索?: "東アジアの文字幅" – ニュース · 書籍 · スカラー · CiNii · J-STAGE · NDL · dlib.jp · ジャパンサーチ · TWL 「東アジアの文字幅」(英: East Asian Width)は、Unicode標準の附属書 (英: Unicode Standard Annex) の一つ。Unicodeに収録されている各文字の文字幅に関するヒントを与える East_Asian_Width 参考特性(英: informative property)を定めている。 東アジアのマルチバイト文字コード規格は必ずしも文字幅を
■_ 閏年 なんか閏年の2/29の扱いで不具合というのを見かけましたが、あるエピソードを一つ。 閏年の判定というのは西暦年が4で割り切れるというだけでなく 100でどうとか400でどうとかありますよね。 で、1990年代に開発された製品の中に この閏年の判定をただ単に4で割り切れるかどうかでしかやっていなかったのだけど、 2000年が400で割り切れるために手抜きの実装(バグ)が発覚しないですんでしまった ものがあったとかなかったとか。 それとは別に、なぜか100での判定はやってるのに400ではやってなくて以下略なものとか。 ■_ Pythonのお勉強 Part46 66 デフォルトの名無しさん [sage] 2012/02/29(水) 08:31:09.46 ID: Be: >>> u'%10s' % (u'abc') u' abc' だとスペース7個のあとに「abc」が表示されますが
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く