- PR -

桁数とバイト長

投稿者投稿内容
未記入
ぬし
会議室デビュー日: 2004/09/17
投稿数: 667
投稿日時: 2007-05-08 18:01
引用:

折り返し処理をするための文字の表示幅ならそれでいいのですが、いわゆる全角・半角の区別をする場合のよい方法がないですよね?という話です。ラテン文字といえど、英語のアルファベットのみではなく、フランス語などで特有の半角の文字が存在するわけですし。


フ、フランス語!? うーんフランス語のことまで考えたことはなかったのですが、フランス語を使うシステムにおいては固定幅フォント(fixed/monospaced)が存在しないということなんですか?

たとえば、Java で monospaced フォント、サイズ 12 で文字幅を調べると、半角なら 6、全角なら 12 を返すと思っていたのですが、この原則がフランス語では成り立たないということでしょうか?
nagise
ぬし
会議室デビュー日: 2006/05/19
投稿数: 1141
投稿日時: 2007-05-08 18:37
引用:

未記入さんの書き込み (2007-05-08 18:01) より:
引用:

折り返し処理をするための文字の表示幅ならそれでいいのですが、いわゆる全角・半角の区別をする場合のよい方法がないですよね?という話です。ラテン文字といえど、英語のアルファベットのみではなく、フランス語などで特有の半角の文字が存在するわけですし。


フ、フランス語!? うーんフランス語のことまで考えたことはなかったのですが、フランス語を使うシステムにおいては固定幅フォント(fixed/monospaced)が存在しないということなんですか?

たとえば、Java で monospaced フォント、サイズ 12 で文字幅を調べると、半角なら 6、全角なら 12 を返すと思っていたのですが、この原則がフランス語では成り立たないということでしょうか?


うーん。なんというか、極めて環境に依存しそうな判別方法ですね…。
monospacedのフォントでサイズを指定して横幅が確実に6と12でくると想定して
システム作って大丈夫なんだろうか…。
フランス語のアクサン記号は横幅には影響しないと思うのですが、
「œ」の合字とかは大丈夫なのかと疑問はつきません。

参考:Wikipedia「合字」
http://ja.wikipedia.org/wiki/%E5%90%88%E5%AD%97

UNICODEで動いているからには入力からあらゆる文字コードが入力されてくることを
想定しないといけないわけで、日本語のみを想定したシステムにする場合は
逆に非日本語を弾くようにチェックしないと思わぬ事態が発生するかもしれません。

そういえば、UNICODEのRLOを利用したファイル拡張子の偽装のニュースが
この間出ていましたね。UNICODEでシステムを作っていて、
ヘブライ語などの右から左へ書く文字とか混入されても大丈夫なシステムに
なってるのかを気にしないといけない時代なのかもしれません。

http://slashdot.jp/security/article.pl?sid=07/04/22/0520221
yuzy
大ベテラン
会議室デビュー日: 2002/02/14
投稿数: 117
投稿日時: 2007-05-08 19:05
さらに脱線かもしれませんが、

Windows Vistaだと結合文字がありますね。

Unicodeで、304d, 3099 で "が" みたいに表示されます。
(今、Vistaが手元にないので、多少間違っているかもしれません。)

こういうのを踏まえると、
見た目で長さを制限する、
というのが現実解のように思えてきます。
未記入
ぬし
会議室デビュー日: 2004/09/17
投稿数: 667
投稿日時: 2007-05-08 19:06
引用:

うーん。なんというか、極めて環境に依存しそうな判別方法ですね…。monospacedのフォントでサイズを指定して横幅が確実に6と12でくると想定してシステム作って大丈夫なんだろうか…。


だめなんですか?

引用:

UNICODEで動いているからには入力からあらゆる文字コードが入力されてくることを想定しないといけない



引用:

UNICODEでシステムを作っていて、ヘブライ語などの右から左へ書く文字とか混入されても大丈夫なシステムになってるのかを気にしないといけない時代なのかもしれません。



パッケージ開発・販売なんかだと想定すべき範囲が広いのかもしれませんね。うちは顧客に合わせて専用の業務システムをスクラッチ開発しているので・・・。そこまでの汎用性・堅牢性を求めてはコストが合いません。できることをすべてやる、可能性をすべて潰す、だけでなく、要件を絞り仕様として制限することも重要だと思いますし。まあ、開発しているシステムに要求されているレベルが異なるということで・・・。がんばってください。
nagise
ぬし
会議室デビュー日: 2006/05/19
投稿数: 1141
投稿日時: 2007-05-08 19:59
引用:

未記入さんの書き込み (2007-05-08 19:06) より:
引用:

うーん。なんというか、極めて環境に依存しそうな判別方法ですね…。monospacedのフォントでサイズを指定して横幅が確実に6と12でくると想定してシステム作って大丈夫なんだろうか…。


だめなんですか?



一応考えられるネタとしては、フォント名が固定ではなくmonospacedにしているだけだと
JavaVMが実行されるOSやフォントの設定環境、VMのバージョンなどで取れる幅が
変わる可能性があるのではないかと。

monospacedでフォントサイズ12なら幅は6か12なんだよ!という仕様
どこかで定められているなら信用しちゃっていいと思うんですが、
その辺の値って環境依存なのではないかと思うのですよね。
だから、汎用的な判断手法として使えるほどの信頼性があるのかどうなのか…。

もっとも、業務システムなんてものは固定できるところは固定しちゃって構わないので
客先の環境で動けばそれでよし、というのもアリでしょうが、OSのバージョンアップとか
そういった環境変更のタイミングでなにか不具合がでるんじゃなかろうか、という懸念があります。
このあたりはケースバイケースですね。
nagise
ぬし
会議室デビュー日: 2006/05/19
投稿数: 1141
投稿日時: 2007-05-09 18:17
引用:

nagiseさんの書き込み (2007-05-08 19:59) より:
monospacedでフォントサイズ12なら幅は6か12なんだよ!という仕様
どこかで定められているなら信用しちゃっていいと思うんですが、
その辺の値って環境依存なのではないかと思うのですよね。
だから、汎用的な判断手法として使えるほどの信頼性があるのかどうなのか…。



一応、いいだしっぺの法則にのっとり私が実験してみたところ、
monospaced、PLAIN、サイズ12のフォントでFontMetrics.charWidth()をしたところ、
幅が6、12にならないケースがいくつか発見できました。
WindowsXP、SunのJDK1.5のVMを使用しています。

コード:
文字幅│個数
───┼──
0     │173
1     │1
2     │2
3     │21
4     │24
5     │42
6     │1451
7     │573
8     │91
9     │43
10    │21
11    │126
12    │62912
13    │26
14    │11
15    │9
16    │3
17    │2
18    │3
19    │2


ベブライ語やアラビア語やタイ語などの横幅を調べると
6、12にならないことが簡単に確認できます。
フランス語の合字のCEなどは幅6でした。参考まで。

スキルアップ/キャリアアップ(JOB@IT)