[文字コード] UnicodeとUTF-Xの違い
UnicodeとUTF-8, UTF-16, UTF-32の違いに関するメモ.
Unicode
1つひとつの文字に符号位置と呼ばれる整数値をつけて管理している.
UTF-X
UTF-8, UTF-16, UTF-32などはエンコーディング方式と呼ばれるもので, 符号位置の整数値をコンピュータが使用できるようにバイト列に変換する.
検証
Python3によるUnicodeでの名前, 符号位置, 各エンコーディング方式でのバイト列の出力.
import unicodedata import binascii # 名前 print('名前: ' + unicodedata.name('鬱')) # 符号位置 print('符号位置: ' + str(ord('鬱'))) # UTF-8(16進数表記) print('UTF-8: ' + str(binascii.hexlify('鬱'.encode('UTF-8')))) # UTF-16(16進数表記) print('UTF-16: ' + str(binascii.hexlify('鬱'.encode('UTF-16')))) # UTF-16LE(16進数表記) print('UTF-16LE: ' + str(binascii.hexlify('鬱'.encode('UTF-16LE')))) # UTF-16BE(16進数表記) print('UTF-16BE: ' + str(binascii.hexlify('鬱'.encode('UTF-16BE')))) # UTF-32(16進数表記) print('UTF-32: ' + str(binascii.hexlify('鬱'.encode('UTF-32')))) # UTF-32LE(16進数表記) print('UTF-32LE: ' + str(binascii.hexlify('鬱'.encode('UTF-32LE')))) # UTF-32BE(16進数表記) print('UTF-32BE: ' + str(binascii.hexlify('鬱'.encode('UTF-32BE'))))
実行結果:
名前: CJK UNIFIED IDEOGRAPH-9B31 符号位置: 39729 UTF-8: b'e9acb1' UTF-16: b'fffe319b' UTF-16LE: b'319b' UTF-16BE: b'9b31' UTF-32: b'fffe0000319b0000' UTF-32LE: b'319b0000' UTF-32BE: b'00009b31'
[文字コード] BOM
BOMについてのメモ.
BOM
BOM(Byte Order Mark)とは, Unicodeなどの16ビット幅のエンコーディング方式において, バイトオーダーを指定するためにファイルの先頭に挿入される16ビットの値.
UTF-16などのエンコーディング方式では, ビット列の並びとしてリトルエンディアンとビッグエンディアンの両方を許容しているため, 誤ったエンディアンでデータを読み込むと判読できなくなる.
そのため, ファイルの先頭にあるBOMを読み込み, そのデータがどちらのエンディアンで作成されたのかを判別してから残りを読み込む.
BOMは0xFEFF
という値で, これを誤ったエンディアンで読み込むと0xFFFE
となる.
また, UTF-8でエンコーディングされたデータはエンディアンに関わらず同じデータになるためBOMは必要ないが, データがUTF-8でエンコーディングされていることを明示的に表すためにBOMを付加することが許容されている.
UTF-8でBOMがあることによる被害例
UTF-8でBOMがないことによる被害例
[PHP] シングルクォーテーションとダブルクォーテーションの違い
PHPのシングルクォーテーションとダブルクォーテーションの違いに関するメモ.
シングルクォーテーション
文字列中の変数を値に置換しない.
<?php $var = 'pen'; echo 'This is a $var.';
実行結果:
This is a $var.
ダブルクォーテーション
文字列中の変数を値に置換する.
<?php $var = 'pen'; echo "This is a $var.";
This is a pen.
ダブルクォーテーションの方が高機能な処理を行うため, シングルクォーテーションの方が処理が速い.
そのため, 変数を値に置換する必要の無い場合は基本的にシングルクォーテーションを使って記述する.