掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
”你好”のバイト長を求めるには (ID:146523)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
> 印刷する時は、その枠内に決められた大きさで、文字を収めるのが大切なので、 つまり、その枠サイズこそが「文字列を納めるのに必要な幅」という事になりますよね。 どのように印刷しているのかにもよりますが、文字を収めきれない場合には (1) 入りきらない部分は、文字の一部欠けさせ、領域部分だけに描画する。 (2) 入りきらない部分は、文字単位で切り落として、領域部分だけで描画する。 (3) 入りきらない場合には、「...」などの省略記号を併用して描画する。 (4) 領域外に溢れさせて描画する。 (5) 入りきれない場合は、文節単位で次行あるいは次頁に送り出して描画を続ける。 (6) 入りきれない場合は、文字単位で次行あるいは次頁に送り出して描画を続ける。 などなど、それぞれ状況に応じて幾つかの描画方法があるかと思います。 そして .NET の描画処理においては、TextRenderer.DrawText に TextFormatFlags のビットフラグを指定する事で、限られた領域内に、 どのように描画するかを決定する事ができるようになっています。 一方、何らかの帳票ツールなどを使って印刷する場合には、ツール側に 収まりきれない部分の印刷方式を指定する機能(AutoSize や WordWarp など)が 装備されていないかをチェックした方が早いかも知れません。 > という日本語の感覚で、中国語のときも まず、その考え方自体から改める必要があるかと思います。 日本語を出力するなら、日本語の感覚で良いですし、 中国語を出力するなら、中国語の感覚で良いですし、 ギリシャ語であれば、ギリシャ語の感覚で良いでしょう。 ただし今回のように、多言語対応のアプリとする場合には、 必ずしも以前と同じ考え方が通用するとは限りません。 たとえば、ギリシャ語の α、β、γ などの文字を例に出すと、これらは 日本語圏(Shift_JIS, EUC-JPなど)においては全角幅で表現される事が多いですが、 ギリシャ語圏(ISO 8859-7, Windows-1253など)では半角幅で表現されるべきものでしょう。 それゆえ Unicode コンソーシアムの EastAsianWidth.txt においては、 これらの文字の「文字幅プロパティ」には、半角でも全角でもなく、 "文脈依存"を表す Ambiguous(曖昧な文字幅) が与えられています。 それに Unicode には、「ゼロ幅文字」と呼ばれる文字も幾つか存在します。 また、改行文字、水平タブ文字、垂直タブ文字、著作権記号(マルC)、 ロゴ(マルR)、トレードマーク(TM)などのように、文字幅を単純には 決定し難い文字も存在するかと思います。それゆえに、印刷枠のサイズに拘るなら、 > "123ABC" の時は 6(半角6文字だから) > "65漢字a"の時は 7(半角3文字+全角2文字だから) > という日本語の感覚で、中国語のときも といった曖昧な仕様のままではいられません。 今回のように複数言語にきちんと対応させるともなれば、それぞれの文字を どのように扱うのかを、きちんと見つめなおす必要があるかと思います。 (そもそも出力に使うフォントが、多言語対応であるかという問題もありますしね) (案1) どのフォントが選択されても対応できるよう、収まりきる文字幅を、 TextRenderer.MeasureText メソッドなどを用いて動的に算出する。 (案2) 文字数を調整するのではなく、TextFormatFlags などを用いて 描画処理側でクリッピング処理を行うことで対応する。 (案3) 特定の固定幅フォントに固定し、それぞれの非日本語圏の文字が、 いわゆる全角/半角のどちらに当たるのかを調べた後、それぞれの文字を 正規表現もしくは文字コード範囲にて調査し、全角/半角の判定を行う。 (案4) 使える文字種を制限し、CJK の漢字圏で扱われない文字の入力を あらかじめ拒否しておくか、またはそれらの想定外の文字が現れた場合に、 一律で別の文字(たとえば、長さゼロの文字列)に置換して描画することで対応する。
←解決時は質問者本人がここをチェックしてください。
更新する
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.