何となく Blog by Jitta
Microsoft .NET 考

目次

Blog 利用状況
  • 投稿数 - 761
  • 記事 - 18
  • コメント - 36414
  • トラックバック - 222
ニュース
  • IE7以前では、表示がおかしい。div の解釈に問題があるようだ。
    IE8の場合は、「互換」表示を OFF にしてください。
  • 検索エンジンで来られた方へ:
    お望みの情報は見つかりましたか? よろしければ、コメント欄にどのような情報を探していたのか、ご記入ください。
It's ME!
  • はなおか じった
  • 世界遺産の近くに住んでます。
  • Microsoft MVP for Visual Developer ASP/ASP.NET 10, 2004 - 9, 2011
広告

記事カテゴリ

書庫

日記カテゴリ

ギャラリ

その他

わんくま同盟

同郷

 

ネタもと:文字列の全角半角判定

某所で、てか、普通の「使う人」は文字コードなんて興味ないだろう。と、コメントがあったので。

確かに、興味はないでしょうね。ただし、「どのように表示/印字されるか」には、執着と言っていいほどの興味があると思います。そして、その執着を満足するために、開発者は知っていなければならないのではなかろうか、と思うのです。


元々、全角/半角という言葉は、格子状にしか表示できないところで、表示するために格子のどれくらいを使用するか、を表していました。「あ」のような文字を表示するために格子を1つ使うとすると、「A」のような文字を表示するためには、格子を左右に2つに分けた半分しか使用しません。ここから、「あ」のような文字を「全角」と呼び、「A」のような文字を「半角」と呼びました。

この、表示幅を表していた言葉をややこしくするのが、「バイト数」という考え方です。Shift_JIS コードにおいて、「あ」のような文字は2バイト、「A」のような文字は1バイトで表現可能でした。これが、表示上の「全角」「半角」と重なって、いつの間にか Shift_JIS の2バイト文字を「全角文字」と呼ぶようになっていました。つまり、表示上の幅を表していて言葉が、メモリ上の幅に変わってしまったのです。

ここに、さらにややこしさを追加するのが、他の文字コードです。Mac がどのような文字コードを使っているのかは知りません。私が使っていたのは UNIX で、こいつでは EUC_JP というコードを使っていました。EUC_JP では、Shift_JIS での 0xA1 ~ 0xDF にあたるコード、いわゆる「半角カタカナ」が、2バイトで表現されます。つまり、半角の幅で全角のバイト数を持つ文字のあるコードなのです。

また、JIS コード。最近のは違うようですが、私が知っている頃の JIS コードは Kanji In コードと Kanji Out コードがありました。つまり、KI コードから KO コードまでは漢字だよ、と。もちろん、1文字1文字を KI, KO コードで挟むこともできます。そうすると、メモリ上の幅はいくらでも増えます。

もう一つ、Unicode。Unicode には、UTF-8 とか UTF-16 とかありますが、この8とか16は、1文字を表現するために必要な、最低のビット数です。UTF-8 は ASCII コードと互換があり、この範囲の文字は8ビットで表現できます。つまり、UTF-8 では、表示幅とバイト数が一致していると言えそうです。いいえ。3バイトや4バイトで表現する文字があります。こういうものは、「3倍角」「4倍角」と言いますか?UTF-16 では8ビットで表現することはありませんが、この場合はどうなります?というか。バイト数で「全角」「半角」と言っていたのが、いつの間にか表示幅に変わっていますよ?

さらにややこしくしましょう。今でも「あ」は、「A」の2倍の幅を使って描かれるの?実験。

あい
AAい
IIい

プロポーショナル フォントを使って書いてみました。「い」の位置がずれてますよね。「A」と「I」は、同じ「半角」のはずなのに、これも位置が違います。つまり、プロポーショナル フォントを使うと、表示幅でも「全角」「半角」ではなくなってしまいます。


Windows の世界で「全角/半角」というと、たいていの場合は「Shift_JIS コードで、2バイト文字と1バイト文字」を表していると考えていいでしょう。しかし、その考え方が、なぜ必要なのでしょう?

.NET アセンブリの中では…System.String クラスが扱うのは UTF-16 です。System.Char 構造体も、2バイトです。これは、Common Language Infrastructure の話なので、Windows に限らず、どの OS に移植されてもそのように作られていることが期待できます。

データベースも、昔はバイト単位で varchar の幅を指定していましたが、今では文字数単位で幅を指定できます。また、Unicode から他のコードへ変換すると、「Wave-Dash 問題」のようなことが発生するため、同じ Unicode で構成する方がいいでしょう。そうすると、「データベースではバイト数で指定しているので、バイト数で制限したい」という問題はなくなります。というか、なくさなければならないと言えるでしょう。

表示にしても、プロポーショナル フォントを使用すると、1文字の幅は一定していないため、「漢字に2文字分の読み仮名」などということが馬鹿げてきます。少なくとも確定申告の用紙は漢字2文字に付きふりがな3文字なので、フリガナが半角である必要がありません。「表示の幅を狭めるため」ということでも、フォント サイズやストレッチなどで調整できます。そうすると、表示幅の面でも全角だの半角だのいう必要はなさそうです。

そんなわけで、「全角/半角」という言葉が出てきたら、「何をもって全角というの?」と聞きたい。そして、それを通り越して、「そもそも、なんでそんな判断をしなければならないの?」と聞きたいのでした。

もちろん、URL や メールアドレスは、ASCII 7bit コードで書かれなければなりません。このことから、「半角のみ」を判定したい?いえいえ。こいつを判定したいなら、「半角のみ」ではなく、「ASCII 7ビットの可視文字」であるはずです。つまり、Shift_JIS の「半角カタカナ」が入ってはいけませんし、制御コードも入ってはいけません。え?「制御コードなんて、キーボードから入力できないだろ」ですって?そんなことはありませんよ。バックスラッシュ(円マーク)に続けて入力すると、制御コードと判断されるかもしれませんよ。あるアプリケーションのとある設定項目で、「円マーク」は入力できない、となっていました。確かに、「\\」とか「value\」は入力できないのですが、「\t」は入力できました。制御コードのタブ文字と判断されてしまったからです。

つまり、「全角/半角」という区別では、本当にしたいことが、適切に表現できていない場合があるです。

「全角/半角と表現したことが、本当は何がしたいのか」、「本当にその判別をしなければならないのか。あるいは、判別しないとどんな不都合があるのか」という2点。もう一度、考えていただきたいと思います。


余談:ところで、ここまで「バイト」という言葉を多用していますが、「バイト」も長さが不定であると、ご存じでした?C 言語の int のビット数と同じで、その処理系で一番扱うのが簡単な長さが、バイトです。でも、8ビットで1バイト、というのが通例になっています。ここでも、8ビットを1バイトとしました。

投稿日時 : 2007年8月20日 22:23
コメント
  • # re: 全角?半角?
    中博俊
    Posted @ 2007/08/20 22:54
    >Kanji In コードと Kanji Out
    正確には漢字IN, 英字INの方が近い
    さらに細かく見ると、漢字INも現在はJISの種類がいろいろあるのでちょっと違う
  • # re: 全角?半角?
    凪瀬
    Posted @ 2007/08/21 9:30
    文字幅の問題とbyte数の問題の2方面の問題があるのですよね。
    そして、昔の等幅フォントでShift_JISの時代はこの2つの問題が見事に一致していた、と。

    トゥルータイプフォントの出現で横幅の問題は新たな進展を迎えたし、
    バイト数の問題はUnicode時代になって別の進展を迎えたというのに、
    合致していた頃のイメージで問題を考えるから埒が開かない。

    # 1バイトを正確を期してオクテットって表現すると伝わりにくいしw
  • # re: 全角?半角?
    ぽぴ王子
    Posted @ 2007/08/21 11:38
    本文は長いので読んでないのですが(こらーっ!
    凪瀬さんのコメントがものすごく端的にこの問題を表していてそれだけで納得。

    ---------- この辺から余談になります。

    元々のBBSでの話になると。
    文字コードがUTF-8だろうがUTF-16だろうが、スレ主ちゃんの言っている全角半角は
    シフトJISであろうし、本人もそれ以外に何があるのかすら疑わずに考えているのだ
    と思うのです。
    そこで「Unicodeが~」とか「今はプロポーショナルフォントがあるから~」とか、それは
    それでまっとうな、至極正論な話なんだけど、逆にスレ主ちゃんには余計なノイズにしか
    聞こえないんじゃないかと。

    スレ主ちゃんは別に「説教はいいから答えだけくれ」的な人じゃないけど、まずは
    シフトJISで全角と半角の区別をする方法を教えてくれ、文字コードの問題云々はそれから
    だ!と僕なんかは勝手に思ってました。
    むしろスレ主ちゃん自身も、お客さんが全角半角とか言い出すからそれでやってるんだけど…
    という人だったりするとまた被害者であるわけで、そこで第三者が余計なことを言うべき
    ではないと考えたんですよ。すでにスレ主ちゃん置いてきぼりだったし。
    文字コード云々の問題は中さんも書いているし、Jittaさんもここでこうやって啓蒙されてます
    けど、それはここで(あるいは個々で)やるべきであって、人の質問を遮ってまでオレが
    オレがとしゃしゃり出るのは違うんじゃないかな?なんて思ったのね。
    だから、Jittaさんがここで啓蒙活動するのは全然構わないと思ってるし、むしろ文字コード
    の話でいうと全角半角なくなってしまえ派なのです。私も。

    ---------- この辺まで余談です。読み飛ばしても結構です。

    僕も以前一から作ったシステムは「これは文字数です!バイト数などというあいまいな
    ものではありません!」と最初に説明して、全角半角とかそういったくくりではなくて文字数
    で全部統一しました。SQL Server だったから、NVARCHAR 使って。
    今後はそういう方向で世の中が動いてほしいものですな。
  • # re: 全角?半角?
    凪瀬
    Posted @ 2007/08/21 19:35
    でも、UTF-8でXXバイトっていう入力制限は実際微妙ですよ?w
    帳票も含めて考えると、横幅xxドットが第一制限で、
    "I"のような横幅の小さい文字を並べた場合などに限り、
    バイト数上限に引っかかるぐらいが対ユーザ向けの
    UIとしては妥当なんじゃないかな、と思っています。
  • # re: 全角?半角?
    Jitta
    Posted @ 2007/08/21 21:02
    あちらでは、啓蒙なんかやってませんよ?
    「わっけわかんねー!定義しやがれ~」
    ですけど...
    説教臭いと言われれば否定はできませんし、他の人への説明が「質問者置いてけぼり」と言われれば、それもそうでしょう。
    しかし、状況の説明がない以上、定義してもらわないと答えられないと思います。
    フリガナを、半角カナのみにしたかったのかも知れない。
    住所の入力で、丁や地番は半角数字にしたかったのかもしれない。
    URLやメルアドだったのかも知れない。

    啓蒙するところがあるなら、こういう、質問の背景を明らかにして欲しい。ここです。これによって、答えは大きく変わると思います。
  • # re: 全角?半角?
    ぽぴ王子
    Posted @ 2007/08/22 0:12
    あ、そうですね。啓蒙は中さんか…

    ただ、定義してもらわないと…ってのは確かに僕も思ったのだけど
    「で、どうなん?シフトJISってことでいいのん?」でスレ主ちゃんの
    回答を待つぐらいの時間はあっても良かったなとか。
    あれじゃ答えたくても答えられない状況になってた気がして。

    僕は待ってても答えてくれそうになかった(すでにそんな状態じゃなかった)
    ので、シフトJISと仮定して回答してみましたが、役に立ったかどうかは
    なんとも反応がないのでわかんないですね。
  • # re: 全角?半角?
    Jitta
    Posted @ 2007/08/22 6:59
    回答者は、質問者よりも多くの経験をもっている場合が多いでしょう。(この経験こそ、年の功なんだろう)その経験は、質問者の想定外な場合もあるでしょう。
    こんかいの場合、「半角全角を定義しろ」ってのは、想定外だったのではないかと思います。

    ただねぇ………

    調べたの?とか、想定外の反応にだんまりしちゃうか。いや、うちの若いのもそうだし、自分が若かったときもそうだったかも...



    あ、そうそう、凪瀬さん。要約ありがとう(>_<)
    その要約の、歴史的経緯が書いてあります〉王子様
  • # re: Unicode&TrueType時代の入力制御
    凪瀬 Blog
    Posted @ 2007/09/13 22:14
    re: Unicode&TrueType時代の入力制御
  • # re: 全角?半角?
    SE風味
    Posted @ 2007/11/29 23:07
    はじめまして。投稿されてから既に時間がたっているところで、書き込みさせていただくことをお許しください。

    確かに、WWWなどで表示する際には、
    プロポーショナルフォントが基本でしょうから、
    全角・半角は無意味といえると思うのですが、
    HTMLメールがNGであることも多いメールでは、
    全角・半角で長さを判断したい場合が多いのではないでしょうか。

    ま、メールなので、どうせUTFではなく別の文字コードに書き換えるのだから、変換した上で処理すればいいといわれれば、それまでではあるのですが、出来るなら、送信直前までUTFのままでいけると、分かりやすいんですけどね。
  • # re: 全角?半角?
    Jitta
    Posted @ 2007/11/29 23:29
    SE風味さん。初めまして、こんにちは。
    コメントありがとうございます。

    > 確かに、WWWなどで表示する際には、
    > プロポーショナルフォントが基本でしょうから
    えっとですね。
    まだ @nifty が Nifty-Serve だったころ。出入りしていたフォーラムのシスオペが、「文字の位置があわないって、プロポーショナル フォントなんだからスペースで位置を調整しようってのがおかしいんだ!!」とのたまってました(using MS-Word)。
    写植の世界では日本文字もプロポーショナルですし、日本文字自体、本来は縦方向にプロポーショナルです。
    また、漢字に比べて仮名は小さい方が整って見えると言われています。
    縦横が同じ大きさにきちっとそろっているのって、中国文字くらいではないでしょうか。

    そういう意味で、元々不自然なことをしていたのかもしれません。

    おそらく、昔のようにリソースが足りないとあわてることも少なくなったから、気楽に行こうよ。
    ってことじゃないかと思うのです。
  • # 再燃したので、もう一度
    何となく Blog by Jitta
    Posted @ 2008/01/31 22:36
    再燃したので、もう一度
  • # essay writer reddit b55gvh
    AaronBlact
    Posted @ 2022/09/08 20:42

    Wow loads of great data. https://definitionessays.com/ help for writing
  • # thesis writing service u49pij
    Albertosed
    Posted @ 2023/02/10 22:48
    You suggested it well.
    https://essaywritingservicelinked.com/ good essay writing services
  • # buy critical essay c20joy
    CharlesSnoff
    Posted @ 2023/02/26 16:30
    You actually stated it terrifically.
    essays online to buy https://quality-essays.com/ where to buy essays online
  • # help for writing d982cz
    Gregorysaipt
    Posted @ 2023/03/06 9:29

    Amazing a lot of wonderful data.
    writing about yourself essay https://paperwritingservicecheap.com buy custom essay online https://phdthesisdissertation.com
  • # graduation dissertation q75nlb
    EugeneSib
    Posted @ 2023/03/06 10:25

    Well voiced certainly. .
    choosing a dissertation topic https://custompaperwritersservices.com dissertation psychology https://bestpaperwritingservice.com
  • # dissertation writing help uk p98nxq
    EugeneSib
    Posted @ 2023/03/07 1:32

    Truly all kinds of great data!
    how to write a biography essay https://dissertationwritingtops.com help writing a personal statement https://writingpaperforme.com
  • # how to write a cause effect essay s84tmg
    Gregorysaipt
    Posted @ 2023/03/07 8:07

    Superb knowledge. Kudos.
    write essay for money https://writingthesistops.com purpose of writing an essay https://writingthesistops.com
  • # writing a critical essay b76tlv
    EugeneSib
    Posted @ 2023/03/07 16:27
    You actually suggested it fantastically!
    college education essay https://custompaperwritingservices.com dissertation example https://helpwithdissertationwriting.com
  • # college personal essays l857sa
    Gregorysaipt
    Posted @ 2023/03/08 6:29

    Perfectly voiced genuinely. .
    how do you cite a website in an essay https://essaywritingservicehelp.com best college application essay service https://researchproposalforphd.com
  • # college education essay u38qnv
    EugeneSib
    Posted @ 2023/03/09 0:45
    You suggested this exceptionally well!
    college essay for transfer students https://essaywriting4you.com college essay funny https://custompaperwritersservices.com
  • # my dissertation n42ylo
    Gregorysaipt
    Posted @ 2023/03/10 2:03

    Amazing content. Thanks a lot!
    doctoral dissertation writing service https://helpwritingdissertation.com ivy league college essays https://writingthesistops.com
  • # how to write a citation in an essay w17qma
    EugeneSib
    Posted @ 2023/03/10 21:02

    Terrific forum posts, Thanks!
    what to write a persuasive essay on https://argumentativethesis.com marketing dissertation https://essaywritingservicetop.com
  • # community service essay sample l37wwj
    Gregorysaipt
    Posted @ 2023/03/10 23:36
    You actually stated this effectively.
    how to write a college entry essay https://ouressays.com all ivy writing services https://ouressays.com
  • # funny college essay k21jqe
    EugeneSib
    Posted @ 2023/03/12 3:20
    You mentioned it really well!
    best college essays https://domycollegehomeworkforme.com help writing an argumentative essay https://bestonlinepaperwritingservices.com
  • # how much is a ghostwriter d79wnv
    Gregorysaipt
    Posted @ 2023/03/13 16:51

    You definitely made your point!
    custom order essays https://helpwritingdissertation.com how to do essay writing https://essayservicehelp.com
  • # online essay writing service review m45nld
    EugeneSib
    Posted @ 2023/03/13 23:10
    You actually reported that superbly!
    how to write an expository essay https://argumentativethesis.com custom of writing letters https://essaywritingserviceahrefs.com
  • # what to write in a college essay x88dng
    EugeneSib
    Posted @ 2023/04/02 9:19

    With thanks. Quite a lot of forum posts.
    best thesis writing service https://essaywritingserviceahrefs.com help write essay online https://writeadissertation.com
  • # The plugins developed for WordPress
    Justas
    Posted @ 2023/05/09 23:12
    The plugins developed for WordPress serve to enhance the features and functions of a WordPress website, allowing you to build your awesome and functional site https://t.me/wpigaming/648 Customise WordPress with powerful, professional and intuitive fields.
  • # doxycycline 150 mg https://doxycycline.forum/ doxycycline
    Doxycycline
    Posted @ 2023/11/25 16:21
    doxycycline 150 mg https://doxycycline.forum/ doxycycline
タイトル
名前
Url
コメント