MW211 EXIT

devlog
文字コード/半角カタカナの全貌
2014年06月25日
半角カタカナにどのようなものがあるかは、
シフトJISの半角カナの文字コード定義を参考にすればよいだろう。
                                           (カナは全角で記載してある) 
┌─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┐
│  │_0│_1│_2│_3│_4│_5│_6│_7│_8│_9│_A│_B│_C│_D│_E│_F│
├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
│A_│  │。│「│」│、│・│ヲ│ァ│ィ│ゥ│ェ│ォ│ャ│ュ│ョ│ッ│
├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
│B_│ー│ア│イ│ウ│エ│オ│カ│キ│ク│ケ│コ│サ│シ│ス│セ│ソ│
├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
│C_│タ│チ│ツ│テ│ト│ナ│ニ│ヌ│ネ│ノ│ハ│ヒ│フ│ヘ│ホ│マ│
├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
│D_│ミ│ム│メ│モ│ヤ│ユ│ヨ│ラ│リ│ル│レ│ロ│ワ│ン│゛│゜│
└─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┘
『。「」、・ー゛゜』あたりが半角カナ記号といったところか。
分類:文字コード
文字コード/シフトJISをUTF-8に見立てた場合・続き
2013年10月04日
シフトJIS「0x??C?」~「0x??F?」はUTF-8的にはエラーとなると書いたが
これは文字列の最後にこれが来る場合に限られる。

例えば、以下の場合
  陸(0x97A4)…○
  上(0x8FE3)…×
「陸上」は「上」が最後に来るのでエラー。
でも「上陸」は「上」が最後に来ないのでエラーとはならない。

単純に「上」という字がヤバいと錯覚すると、「上陸」がOKなのが想定外となり
混乱するので注意。
分類:文字コード
文字コード/シフトJISをUTF-8に見立てた場合
2013年10月03日
UTF-8では、バイト毎に、先頭4ビットに、以下のような意味を持たせている

「0???」→1バイト文字
「10??」→2バイト文字以上の2バイト目以降
「110?」→2バイト文字の1バイト目
「1110」→3バイト文字の1バイト目
「1111」→4バイト文字の1バイト目

よって、シフトJISの2バイト文字で、「11??」が2バイト目の前半にはまると、
それはUTF-8的にはエラーとなる(後続にバイトが続かないから)。
#但し、「10??」が1バイト目の前半にはまっても大目に見てくれるようだ

つまり、シフトJIS「0x??C?」~「0x??F?」はUTF-8的にはエラーとなる。
分類:文字コード
UTF-8/マルチバイト文字の長さ
2012年05月17日
マルチバイト文字(日本語文字)について、
「SHIFT_JIS」は「2バイト」、「UTF-8」は「3バイト」…などと
誤って覚えちゃダメです。
UTF-8のマルチバイト文字は(一文字当たり)、「1バイト~4バイト」なのです。

各バイトの先頭ビット辺りにバイト長の識別子が付加され、
その残りで文字を識別する。
┌────┬──────────────────┐
│1バイト │0_______                            │
├────┼──────────────────┤
│2バイト │110_____ 10______                   │
├────┼──────────────────┤
│3バイト │1110____ 10______ 10______          │
├────┼──────────────────┤
│4バイト │11110___ 10______ 10______ 10______ │
└────┴──────────────────┘

ざっとこんな感じ(なのか?)
┌──────────────────┐  ┌─────────────┐
│0AAAAAAA                            │→│                  0AAAAAAA│
├──────────────────┤  ├─────────────┤
│110AAAAA 10BBBBBB                   │→│         00000AAA AABBBBBB│
├──────────────────┤  ├─────────────┤
│1110AAAA 10BBBBBB 10CCCCCC          │→│         AAAABBBB BBCCCCCC│
├──────────────────┤  ├─────────────┤
│11110AAA 10BBBBBB 10CCCCCC 10DDDDDD │→│000AAABB BBBBCCCC CCDDDDDD│
└──────────────────┘  └─────────────┘

なにかとサニタイズで話題の「/」ですが…。

「/」は「0x2F」なわけだが、以下の四つはすべて「0x2F」=「/」を表すことになる。
上記の法則に照らし合わせてみれば、以下の様々なパターンが該当する。
┌──────┬──────────────────┬
│2F          │00101111                            │
├──────┼──────────────────┼
│C0 AF       │11000000 10101111                   │
├──────┼──────────────────┼
│E0 80 AF    │11100000 10000000 10101111          │
├──────┼──────────────────┼
│F0 80 80 AF │11110000 10000000 10000000 10101111 │
└──────┴──────────────────┴
                                      ┬──────────────────┐
                                      │                           _0101111 │①
                                      ┼──────────────────┤
                                      │                  ___00000 __101111 │②
                                      ┼──────────────────┤
                                      │         ____0000 __000000 __101111 │③
                                      ┼──────────────────┤
                                      │_____000 00000000 00000000 __101111 │④
                                      ┴──────────────────┘

で、①②③は「bin2hex()」で「/」に変換できたが、④は変換できなかった。
「/」を「hex2bin()」で変換すると「2F」となった(最短優先みたい)。
分類:文字コード
PHP/Shift_JISとUTF-8
2012年05月12日
「UTF-8」にあるのに「Shift_JIS」にはない文字というのがある。

(マルチバイト文字)「1文字」に対して「Shift_JIS」は「2バイト」使うのに対して
「UTF-8」は「3バイト」とか使うのだから、当然そういう文字があっても不思議はない。

で、そういう文字を「UTF-8→Shift_JIS」変換したらどうなるのか?
大抵は「?」とか特定の文字に変換される。
┌──────────────────────────────────────┐
│mb_convert_encoding('■', 'SJIS-win', 'UTF-8');                             │
└──────────────────────────────────────┘
この結果は「?」となる。(「■」が「UTF-8」固有文字だったとする)

┌──────────────────────────────────────┐
│mb_convert_encoding('あいう■えお', 'SJIS-win', 'UTF-8');                   │
└──────────────────────────────────────┘
ちなみにこういう混在している場合は「あいう?えお」となる。
→他の文字に悪影響は与えない

では、「UTF-8→Shift_JIS→UTF-8」と行って来い変換した場合は?
┌──────────────────────────────────────┐
│mb_convert_encoding(mb_convert_encoding('■', 'SJIS-win', 'UTF-8'),         │
│                    'UTF-8',                                                │
│                    'SJIS-win');                                            │
└──────────────────────────────────────┘
結果は「?」。

一旦「?」になってしまったら、もう「?」なのだ。
分類:PHP、文字コード
メモ帳の文字コード
2012年05月03日
メモ帳ではあまり文字コードを意識することがない。
たいていのエディタでは編集中に現在使用中の文字コードを表示しているものだが
メモ帳の場合、これがないからかもしれない。

ということで、あらためて、メモ帳における文字コードのおさらい。

まず、メモ帳において使用できる文字コードは以下の3つ。
  ・ANSI(=Windows版Shift_JIS=CP932)
  ・UTF-8
  ・Unicode(=UTF-16)
つまり「EUC-JP」は使用できない。

文字コードを自発的に指定したい場合は、以下の2つの方法がある。
  ・ファイルを開く時に、指定する
  ・ファイルを保存する時に、指定する
つまり、編集中に変更はできない(一発で変換して再表示ってことはできない)。

文書ファイルのダブルクリックや
メモ帳に対するドラッグ&ドロップでファイルを開いたりする場合
文字コードをある程度自動認識してくれる。
この使い方をすることが多いと思うので、文字コードを意識しづらい。

自動認識の基準は(先頭の)「BOM」のようだ。
UTF-8、UTF-16で保存した場合は、自動で「BOM」を付加する。


ついでに別件だが、改行コードは「CR+LF」のみを認識し、
「CR」や「LF」だけだと改行として認識しない。

メモ帳の特徴といったらこんなところか。
分類:文字コード
前へ 1 次へ