マルチバイト文字のバイト単位的処理

マルチバイト文字セット(MBCS)には、1バイトのマルチバイト文字(シングルバイト/いわゆる半角文字)と2バイトのマルチバイト文字(ダブルバイト/いわゆる全角文字)がある。ここでは、その「バイト単位的処理」の例である。
これに対して「文字単位的」処理がある。これはUnicode的に処理することになる。その例はここを参照。

重要
マルチバイト文字セット(MBCS)とは、それぞれの文字が1バイト値または2バイト値で表現される文字セットをいう。
ASCII文字セットはサブセットとしてMBCSに含まれる。

LOG
210.133.104.13 [21/Jul/2017:15:09:41] vbs マルチバイト変換
180.0.217.89 [20/Jan/2017:12:26:40] excel マルチバイト文字セットを使用する
ありえないことを言い出す。だれにも意味は通じない。さすがエクセルバカは無知蒙昧の最大最強のバカである。超基本も知らない。今さらながらそれを実感する。そのくせ、一人前に「文字コードごっこ」だけはしたがる。バカにつける薬はないようである。

ここで対象にしているのは「文字コード」の処理である。ネットバカの大好きなUTF-8は文字コードではないからこういう所では出る幕はない。単にエンコードの問題にすぎない。もっとも、基本がわかっていないネットバカ(その99.9%はエクセルバカ)に言ったところでムダだが(笑)。
LOG
126.152.230.51 [07/Mar/2016:08:59:52] c言語 文字コード utf8 全角 判定
49.97.55.224 [08/May/2015:07:44:32] c言語 全角 判定 UTF-8
49.96.47.149 [30/Apr/2015:07:25:34] c言語 全角判定 utf-8
49.98.155.126 [27/Apr/2015:19:58:30] c言語 全角判定 utf-8
この発想はエクセルバカそのものである。
163.135.151.76 [24/Apr/2015:11:34:42] C 言語 utf-8 半角カナと全角文字を判定
この発想はエクセルバカそのものである。
114.160.244.6 [11/Dec/2014:19:46:17] C++ UTF-8 大文字
114.164.22.204 [04/Oct/2014:19:54:11] visual C++ 1文字 日本語 ひらがな UTF-8
180.43.13.21 [11/Sep/2014:01:50:03] C++ UTF-8 文字数
182.249.242.141 [04/Aug/2014:14:28:38] utf-8 半角全角 判定 C
182.249.246.16 [15/Jul/2014:15:42:41] c++ utf-8 文字列 全角 半角
116.3.0.212 [23/Dec/2013:18:28:24] c言語 全角 判定 utf 8
117.55.68.36 [20/Oct/2013:21:51:03] UTF-8 ひらがな 判別 C
1.78.4.59 [23/Oct/2013:18:24:33] c言語 全角 判定 utf8
218.25.32.210 [13/Oct/2013:20:54:06] 全角 判定 C UTF-8
C言語を知っている者にはありえないことである。
180.62.208.132 [17/Dec/2013:19:28:17] c++ マルチバイトをシングルバイトに変換
C++言語を知らないただのケタはずれのバカある。
118.20.80.74 [23/Jan/2014:18:22:38] UTF-8 2バイト文字 判別
118.20.80.74 [24/Jan/2014:12:24:38] utf-8 マルチバイト判別 C言語
基本的知識もないオバカである。
61.113.105.35 [24/Jan/2017:15:57:29] ダブルバイトをシングルバイトに変換 マクロ
210.138.100.160 [19/May/2015:15:56:19] VB ダブルバイトからシングルバイトへ変換
バカ丸出し。全角半角の変換のことだろうが一般的にはこんな言い方はしない。
掃いて捨てるほど出てくる「UTF-8ごっこ屋」である。基本がまったくわかっていないのである。C言語やC++言語などを知っている者の発想ではない。こういうものは「隠れエクセルバカ」といってもいいだろう。


マルチバイト文字の体感

以下では実例によってマルチバイト文字を体感してみよう(笑)。
「マルチバイト文字」は「日本語」だけを指すものではないということである。
とはいっても、エクセルバカは「マルチバイト文字」が「日本語」だと思い込んでいるのである。バカの思い込みは強固である。しかも勉強はしないからこの「間違った思い込み」がいつまでも続くことになる。

Fig.1


その他の例では下記のようになる。
マルチバイト文字 unsigned char str[]="虎南有香ファンクラブ"; 最初の10バイト中のマルチバイト文字数: 5 文字 unsigned char str[]="虎南ab有香ファンクラブ"; 最初の10バイト中のマルチバイト文字数: 6 文字 ※4文字ではない点に注意 ※マルチバイト文字が日本語だと思っていると4文字だと思い込む(以下同じ) unsigned char str[]="虎南abcd有香ファンクラブ"; 最初の10バイト中のマルチバイト文字数: 7 文字 ※3文字ではない点に注意 unsigned char str[]="虎南abcdef有香ファンクラブ"; 最初の10バイト中のマルチバイト文字数: 8 文字 ※2文字ではない点に注意


全角半角の入り混じった文字列の文字数を数える。



マルチバイト文字列操作

マルチバイト文字列の各文字の後にスペースを入れたものである。
これがマルチバイト文字列のバイト単位的処理の基本パターンであり出発点である。


文字列から各文字を取り出し、それを処理することなどに応用することができる。
  1. 1文字ずつポインタを進めていって各文字を取得する。

  2. ここでその文字種を判定することができる。

  3. また、別の文字種に変換することもできる。なお、すべての文字が変換できるとは限らないから変換できる場合とできない場合とに分けて処理する必要がある。

  4. 変換した文字を個別に取り出して1文字ずつ処理(表示)することもできるし(mb.cpp/文字単位で配列使用)、まとめて文字列として処理(表示)することもできる(mb2.cpp/文字列単位でポインタ使用)。どちらの方法でも最終的な表示結果は同じである。


全角と半角などの変換

一般的に「全角文字→半角文字」に変換するといえば、「全角カタカナ→半角カタカナ」と「全角ひらがな→半角カタカナ」の両方を含んでいる1)

これと逆の動作は「半角文字→全角文字」への変換になるが、これは「半角カタカナ→全角カタカナ」になるだけである。この場合「半角カタカナ→全角ひらがな」にするには「半角カタカナ→全角カタカナ→全角ひらがな」という2段階の変換が必要になる(当然)。しかし、こうする必要性は乏しいだろう。
NOTES
1) 以前 (MS-C Ver6.0ぐらいの時代)とは違って、Microsoft C/C++ Ver7.0以後からは完全に現在のVisual C++と同じ関数名に変わっている。ただし、引数や戻り値は現在のものとは若干差がある。

半角→全角



全角→半角



ひらがな/カタカナの変換



大文字/小文字の変換



JIS→シフトJISの変換



JISコード(16進数)を入力すると、Shift_JISコードに変換し、それに該当する漢字を表示する。いわば「見える」JISコードである。


見えるUnicode

「見える」JISコードに対する余興である。



文字種別の判定

文字種の判定の最も基本的な部分である。これを発展させていくと、いろいろな文字種がもっと具体的につかめるようになる。その入り口である。
なお、「  (09)」は制御コードのタブである(オバカの好きなタブコントロールではない/笑)。




任意の文字列の文字種の判定

上の考え方を発展させると、たとえばこういうようなものになる。


これをさらに発展させて、Windowsプログラムに応用すると、たとえばこういうものができる(mfc5_1020)。
いきなりWindowsプログラムが出来るわけではない。こういう地道な動作テストの上にやっとできることになる。



エクセルバカは「マルチバイト文字」とは「日本語」であると思っている者が多い(無知の害)。一般的に「マルチバイト文字」の「取り出し」「判定」「検索」などといわれても、こんな大雑把なものでは一体何を取り出し、何を判定するのかがわからない。実際には何も検索していないのと等しいのである。
これは肉屋へ行って「肉を買いたい」と注文するのと同じである。店の人には何の肉かわからない。もっと細かく指定する必要があるということである。





愚民列伝(b1)


全角半角文字の混じったファイル内で指定した文字の数を数える(ccp_0024)
全角半角文字の混じった文字列(ファイル)を1文字づつ切り分ける(ccp_0025)
全角半角文字の混じった文字列の全文字数を数える(ccp_0026)



エクセルバカの言うことは無意味である。最近出てきたエクセルバカの野良イヌ検索である。どこかで拾ってきたものであろう。意味は通じない。
エクセルバカは「バイト」という語が大好きなのである。意味は知らないがこれを使えば何か高級なことをしているように錯覚しているのである。それでこういう語の無意味な連呼になってくる。
LOG
124.103.51.237 [06/Dec/2015:21:01:09] ダブルバイトからシングルバイト
210.194.184.99 [05/Dec/2015:02:13:39] ダブルバイトからシングルバイト
123.198.234.123 [05/Dec/2015:20:39:04] ダブルバイトからシングルバイト
114.144.245.66 [02/Dec/2015:15:04:04] ダブルバイトからシングルバイト
103.55.197.244 [01/Dec/2015:19:43:05] ダブルバイトからシングルバイトとは
27.85.19.25 [01/Dec/2015:21:55:30] ダブルバイトからシングルバイト
221.188.13.215 [30/Nov/2015:09:04:43] ダブルバイトからシングルバイト
1.78.34.221 [29/Nov/2015:14:46:44] ダブルバイトからシングルバイトへ
これらは意味は通じないが、善意に解釈すれば、多分マルチバイト文字セット(MBCS)で全角文字を半角文字にするということになる。それ以外には意味をなさない。しかし、普通の人間はそれを上のようには表現しない。
LOG
203.223.81.219 [06/Oct/2015:11:14:41] マルチバイト シングルバイト 半角カナ
125.206.255.105 [28/Sep/2015:17:26:53] C言語 シングルバイト、マルチバイトを区別しながら数える
180.43.82.120 [02/Sep/2015:13:04:57] エクセル VBA SingleをByte
笑えるほど無知。英単語屋である。

以下を見てもわかるようにエクセルバカは明らかにASCIIコードが何なのかを知らない。しかし、そんなバカでも文字コードごっこはしたがるのである。
LOG
133.237.7.83 [10/Jun/2016:11:31:48] asciiコード VBA 全角 chr
49.98.169.100 [22/Apr/2016:13:24:08] c言語 ASCIIコード 全角文字判断
27.142.233.227 [22/Jul/2015:00:41:22] C言語 半角全角文字 判定 ascii
ハチャメチャである。
どこかで「ASCIIコード」なんて語を拾ってきただけの野良イヌ検索である。ASCIIコードがどんなものか見たこともないはずである。しかし、それでもこんなことだけは言いたがるのである。
LOG
219.113.62.14 [17/Apr/2016:11:35:55] エクセル関数 文字をマルチコードに変換
バカがしゃべることは意味が通じない。エクセルバカの「文字コードごっこ」はそんな連中のバカ騒ぎにすぎない。




Unicode,UTF-8,UTF-16,Big,Little,Endian,LE,BE,Shift_JIS,SJIS,CR,LF,CRLF,byte,bit,word,CSV,BOM,Encode,Decode,ANSI, バイナリ,文字コード,16進コード,文字列,ビッグ,リトル,エンディアン,ユニコード,改行,バイト,ビット,テキスト, 半角,全角,カタカナ,ひらがな,カナ,漢字,エンコード,デコード,16進文字列,C言語,C++言語,変換,解析,判定,判別,サンプル, _mbslen,_mbsnccnt,_mbsnbcnt,_mbctombb(zentohan),_mbbtombc(hantozen),_mbctohira,_mbctokana,MBCS,char,unsigned, _mbctolower,_mbctoupper,_mbcjistojms,_mbcjmstojis,_mbbtype,_mbsbtype,mbstowcs,wcstombs,mbtowc,wctomb, マルチバイト,MultiByteToWideChar,WideCharToMultiByte, マルチバイト文字の操作(C/C++/c2_0001) 全角文字と半角文字の相互変換(C/C++/c2_0009) ひらがなカタカナ/大文字小文字の相互変換(C/C++/c2_0015) JISとShift_JISの相互変換(C/C++/c2_0016) EUC-JPとShift_JISの相互変換(C/C++/c1_0169) 文字種別の判定(C/C++/c2_0018) マルチバイト文字列の処理/文字単位で配列使用/文字列単位でポインタ使用(C/C++/c2_0020)