C 文字列操作 新しいページはコチラ
提供: yonewiki
(→文字列比較) |
(→文字列比較) |
||
771行: | 771行: | ||
:stricmp<br /> | :stricmp<br /> | ||
:_strnicmp<br /> | :_strnicmp<br /> | ||
+ | <br /> | ||
+ | という具合の動作であります。collの特徴的なのは辞書順と呼んでいる比較の概念だと思います。<br /> | ||
+ | ASCIIコードでは大文字と小文字とでは、小文字の方が大きい文字コード番号が付与されていますが、<br /> | ||
+ | wcs**coll系の比較をする関数では、小文字の方が値が小さいものとして判定してくれます。<br /> | ||
+ | 漢字の範囲になるとロケールで指定したcp932の文字コード順で比較してくれます。<br /> | ||
+ | 阿という文字と哀という文字はUnicode(UTF16)では阿-0x963F 哀-0x54C0 表-0x8868であり、<br /> | ||
+ | Shift_JISのcp932では阿-0x88A2 哀-0x88A3 表-0x955Cと定義されていますから、<br /> | ||
+ | 阿<nowiki><</nowiki>哀<nowiki><</nowiki>表 のように比較をしてくれます。<br /> | ||
+ | coll系の関数を使わない場合は 哀<nowiki><</nowiki>表<nowiki><</nowiki>阿のように比較されます。<br /> | ||
− | + | '''★豆知識''' | |
− | <br /> | + | '''Unicodeの符号化方式UTF-16とは…''' |
+ | 日本語の範囲ではUTF16は2バイト文字と考えて良いですが、Unicode全体では0x10FFFFまで利用することになっていますので、<br /> | ||
+ | 0x10000以上の値を持つ文字コードは4バイト文字になります。<br /> | ||
+ | この0x10000以上の値になる場合は、ビット列で表現すると110110????xxxxxx 110111xxxxxxxxxx<br /> | ||
+ | のような形式になり????の部分のには上位ビットと下位ビットを16ビットずつに分けた時に0xUUUUDDDDと表記するならば、<br /> | ||
+ | 0xUUUUは0x0001~0x0010の値となり得て、そのUUUU-1の値が????に入ります。xの部分には下位DDDDのビット列そのものが<br /> | ||
+ | 入ったような値になります。そういう意味ではUnicodeのUTF-16という符号化方式では16bit(2byte)だったり32bit(4byte)のコードになります。<br /> | ||
+ | '''Unicodeの符号化方式UTF-8とは…''' | ||
+ | UTF-8はASCIIコードの7ビット文字は1バイトで表し、それ以降の2バイト文字は3バイトで表すような符号化方式です。この方式でUnicode全体を表現するには<br /> | ||
+ | 最大6byteを使います。Unicodeの上位2Byteが0x1~0x10までの値しか使わないので6バイトで表せます。しかしながら日本語のほとんどは2byte文字で表現<br /> | ||
+ | できるので、1文字あたり3バイトになるのはUTF16が2倍増しなのに対して、2.5倍増しとなるのがデメリットです。但し、半角英数文字が登場する比率で、<br /> | ||
+ | そのデメリットは削減できる可能性もあります。日本語を10文字打ったら20byte、7文字打ったら、14byteだから+6文字を半角文字という具合です。7+6だったから<br /> | ||
+ | おおよそ半分半分の文字数がいいみたいね。それほど半角英数文字を使うのは技術情報を書く文書くらいだと思いますが…。その人の趣味によって、仕事によって、<br /> | ||
+ | 損得が変わるというものです。UTF-8はかなり広い範囲で使われています。それは英語圏の人が、日本語のような2バイト文字による被害をまったく被らないからだと思います。<br /> | ||
+ | ちなみに符号化方式によると2バイト文字はビット列をx0,x1,x2,x3, x4,x5,x6,x7, x8,x9,xA,xB, xC,xD,xE,xFと表現すると、<br /> | ||
+ | (1110),(x0,x1,x2,x3),(10,x4,x5),(x6,x7, x8,x9),(10,xA,xB),(xC,xD,xE,xF)となります。文字の先頭に3バイトなら3つの1が付き、1バイト目を構成し、<br /> | ||
+ | 次のバイト以降はバイト先頭に全て10をつける。おかげさまで、1バイト目の下位4bitと、3バイト目の下位4bitの16進数だけはそのままだけど、他のbitは16進表記が<br /> | ||
+ | 変化します。読み起こすのは大変ですね。文字列の最初を見つけたら、そこから文字列に起こしていけば良いですが、新しい変換表を考えないと直感的にはUnicode文字の<br /> | ||
+ | コード表には表現できないですね。 | ||
=='''文字列区切り文字分割'''== | =='''文字列区切り文字分割'''== |