何となく Blog by Jitta
Microsoft .NET 考

目次

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

記事カテゴリ

書庫

日記カテゴリ

ギャラリ

その他

わんくま同盟

同郷

 

ブラブラしていたら見つけた記事:“情報化時代”に追いつけるか? 審議が進む「新常用漢字表(仮)」

こんな事書くと、また安岡氏に降臨されるのではないかと冷や冷やしながら、おもしろがって書いてみる。


依然として、「全角 半角 判別」による検索からの参照が、高い割合を占めています。いい加減、そういう考え方やめようよ...とぼやいても、仕方がない。んな考え方、すでに実情にあっていないんだぞ~!と書き続けることで、考え方が変わってくれることを祈ります。

「全角 半角」以上に困るのが・・・いや、その問題の本質は、文字コード体系間での文字コードの変換ではないでしょうか。「全角 半角」の判別で困るのは、Windows 2000 から Unicode が使えるようになって・・・じゃなくて、VC6 あたりから Unicode が使えるようになって、VC7 から Unicode が既定の文字コードになっているから、ではないでしょうか。-DUNICODE -D_UNICODE が、コンパイラのオプションに既定で追加されており、VC6 の -D_MBCS とは異なっています。VC7 を先にさわった私は、驚きました。。。

掲示板などに出されている質問を見ていると、どうも、(特に C/C++ で)文字と文字列が区別できていなかったり、コンピュータ内部では文字であっても数値であるということがわからないのか、はたまた数字と数値を同じように考えているのではないか?と思われる質問を散見します。数字と数値の混同は、特に VB 使いに多く、これは「暗黙の型変換」による弊害なんだろうなぁ、と思います。


はてさて。「全角 半角 判断」がしたい人は、なぜ、判断をしなければならないのか、理解しているでしょうか?

比較的新しい言語では、文字列を「数える」と、文字数が返ってきます。しかし状況によっては、特にデータベースが絡んでくると、文字数ではなく「バイト数」が欲しくなります。

Oracle では、9i の頃だったと思いますが、VARCHAR2 に対して文字数で幅を指定できるようになりました。この辺に罠が潜んでいます。

データベースの文字セットを Unicode にして、VARCHAR2 の列を「200文字」と設定したとします。すると、内部的には「VARCHAR2で400バイト」に変換されます(9i 当時。10g 以降は知らない)。

これは、おおよそ正しいのですが、Unicode には“サロゲートペア”というやっかいなものが潜んでいます。これが、Unicode における“全角文字”の様な存在で、4バイトで1文字となります。そうすると、もし、サロゲートペアの文字だけでこの列を埋めると、200文字と指定したのに、100文字しか保持できないということになります。

従って、Unicode で判別するべきは、一般に考えられている「全角 半角」ではなく、サロゲートペアか、そうでないか、ということではないでしょうか。もっとも、これだけでは不十分で、合成文字というものありますから、これを使うと1文字が何バイトあるのか、予想できないのですが...

もちろん、Shift_JIS で保存するから「全角 半角」が知りたい、ってこともあるでしょう。ここで、システム全体を通して Shift_JIS しか扱わないなら、それもありです。そうではなく、他のコード体系も扱うなら、果たして Shift_JIS だけに絞った判別が必要なのかどうか、疑問です。

コンピュータの文字をややこしいものにしているのが、コード体系が複数あって、それぞれの体系に完全な互換性がない、ということです。こっちの体系には定義されているが、あっちの体系には定義されていない。すると、こっち→あっち→こっちと、体系を移したとき、最後の「こっち」には違う文字が表示されることになります(これを利用したセキュリティ インシデントもあります)。



そして、タイトルからどんどん離れていくワナ...orz


今でさえ面倒なのに、これ以上面倒なことをさせるか。いっそ、日本語使うのやめるとか(ぉぃ

投稿日時 : 2008年7月29日 22:03
コメント
  • # re: 漢字コードに注目
    画伯
    Posted @ 2008/07/29 22:25
    >>いっそ、日本語使うのやめるとか(ぉぃ


    賛成票を投じます。
  • # re: 漢字コードに注目
    Jitta
    Posted @ 2008/07/29 22:31
    お~い(^_^;)
  • # re: 漢字コードに注目
    シャノン
    Posted @ 2008/07/29 23:50
    int.Parse は、いわゆる全角数字をパースできません。
    もし int.Parse( "1" ) が成功するようになったとしたら、int.Parse( "一" ) や int.Parse( "壱" ) を成功させない合理的な理由はあるでしょうか?
    そして、int.Parse(”一”);は、どうしてダメなのでしょうか?

    プロポーショナルフォントだから全角と半角という呼び方が古いという問題は本質ではないでしょう。
    それなら全角を田中、半角を山田と呼び換えれば解決します。
    それでも、田中と山田という文字が現に存在しているのをどうしましょうか?
  • # re: 漢字コードに注目
    シャノン
    Posted @ 2008/07/29 23:55
    漢字はまた別の難しい問題ですね。
    「神」の偏は「ネ」みたいなやつなのに、「榊」は「木ネ申」ではなくて「木示申」だとかね。
  • # re: 漢字コードに注目
    Jitta
    Posted @ 2008/07/30 7:47
    あれ?長文ポストしたと思ったけど、蹴られた?
  • # re: 漢字コードに注目
    Jitta
    Posted @ 2008/07/30 20:27
    シャノンさん、コメントありがとうございます。

    > int.Parse は、いわゆる全角数字をパースできません。
     その辺が、文字と文字コードの違いかと思います。
    そんなこと言い出すと、int.Parse("さん") を、3 にパースして欲しくなります。。。

    あれ?「プロポーショナルだから全角半角は意味がない」って、今回は言ってないですよね?
    「UTF-16 では、(とりあえず)どの文字も2バイトだから、バイト数で言うところの全角半角は意味がない」ってのが、今回ですけど。。。

     あと、よく調べてないので詳しいことはわからないのですが、「文字セット」と「コードセット」だったかな?その辺も、要注意ですね。
タイトル
名前
Url
コメント