文字コード

アスキーコード表

 アスキーコード表が欲しくなる時が、たまにあります。というわけでコード表です。
 以下は左がバイトの上位、上が下位の桁を表しています。例えば"K"は4xとxBが重なったところにあるので、4Bというわけです。16進数については「16進数と10進数の変換」で解説しています。

アスキーコード表
x0x1x2x3x4x5x6x7x8x9xAxBxCxDxExF
0xNULSOHSTXENXEOTENQACKBELB SH TL FV TF FC RS OS I





1xDLEDC1DC2DC3DC4NAKSYNETBCANE MSUBESCF SG SR SU S
2xSPC
3x
4x
5x_
6x
7xDEL
8x               







9x                
Ax 
Bx
Cx
Dx
Ex                
Fx             (C)TM
表の縦横が逆のものも一般的です。

 問題は0x,1x列のコントロールコードと言われるもので、文字以外の改行とかタブなどの文字の表示を制御するためのコードで、キャラクターベースのOSでは色々と便利に利用されているのですが、Macの場合GUIなのでほとんどのコードは不必要なものです。そんなわけで、各アプリケーションで好きなように利用されていたりします。
 以下のものは、大体のアプリケーションで共通して使われています。

 DEL=デリート/HT=タブ/LF=ラインフィード/CR=キャリッジリターン/SPC=スペース

 以下はコード表を書き出すスクリプト。文字はリストに格納されます。

getCharList()

on getCharList()
	set theChars to {}
	repeat with j from 2 to 15 -- コントロールコードは飛ばして2から
		set end of theChars to {}
		repeat with i from 0 to 15
			set end of item (j + 1) of theChars to ASCII character (j * 16 + i)
		end repeat
	end repeat
	return theChars
end getCharList

日本語コードと、英語コード

 日本語コードと、英語コードではコードに大きな違いがあります。基本は上にある表と同じですが、コード92(5C)は日本語では¥、英語では\になります。
 拡張アスキーコードの部分は、言語フォントによって大きく異なり、日本語の場合は、A1〜DFは所謂半角カナが割り当てられています。英語の場合は数学記号等です。
 129〜159(81〜9F),224〜252(E0〜FC)は2バイト文字(漢字など)の1バイト目に割り当てられています。例えば、以下のようにASCII character命令を二つ&で結合することで、数字から2バイトコードを生成することができます。

(ASCII character 147)&(ASCII character 206) 
--> "鳶"

 逆に2バイト文字から文字コードを得るとなると、かなり面倒なことになります。
 とりあえず、1バイト目のコードはASCII numberを使えば、すぐに判りますが。後ろの方が非常に面倒。
 日本語コードの1バイト目になるコード(ここでは130(82))をくっつけて、Shift-JISの文字1バイト目と合わせて一つの文字にします。すると2バイト目が余るので、character 2 ofで2バイト目を取り出すことができると言う訳です。
 たかだか文字コードを得るだけなのに七面倒ですが。

 ちなみに、Macで主に使われている文字コードはShift-JISです。文字パレットを利用すれば、それぞれの文字のコードが確認できます。
 Mac OS Xは内部的にユニコードを使っているみたいですが、AppleScriptにおけるユニコードは、ちょっと混沌としている状況です。

shiftJIScode("鳶")
--> {147, 206}

on shiftJIScode(theChar)
	set dCode to ASCII number (character 2 of ((ASCII character 130) & theChar))
	return {ASCII number theChar, dCode}
end shiftJIScode

 run script命令で生データを変換することで、16進数から文字列を生成する事もできます。
 run script命令はテキストをその場でコンパイルするので、かなり幅広いことができます。ほとんど最後の武器。あまり真っ当なやり方では無いですが。

hex2char("93CE")
-- > "鳶"

on hex2char(theHEX)
	return run script "《data TEXT" & theHEX & "》"
end hex2char

文字列の問題

 バイナリデータを扱う場合に、以下のようにキャラクターコード0を使用すると、エラーも何もなく、いきなり停止することがあります。

ASCII character 0

 ASCII character命令の問題と言うわけでなく、どうもAppleScriptの文字列の扱いそのものの問題のようで、readによってファイルを読み込んでいるときに発生する事もあります。
 幸いShift-JISでは、0のコードは含まれませんから、上記のハンドラでは、この問題は発生しません。

 文字コードや16進数を扱う場合に、OSAXを利用するという手もあります。Tanaka's osaxはその代表的なものです。
 MT ASCII Numberで文字コードを、MT Hex Dumpで16進データを得ることができます。MT ASCII Charsを使えば、コードから文字を得ることもできます。

 またAppleScriptとしては、アプリケーションがもっている機能を利用するというのもスマートでいいでしょう。多くのテキストエディタで、文字コードに関する命令を使用できるようになっています。

追伸

 ちなみに、ASCIIってのはAmerican Standard Code for Information Interchangeの略なので、アスキーコードって言葉には、実はcodeが二回含まれていて、良くわからん事になってます。でも、もはや慣習となっているので、突っ込まないでやって欲しいです。てへ。

 さらにちなみに、上二列のコントロールコードは、下に4つずらしたキーのコントロールキーとのコンビネーションになっています。
 つまりCtr+HはBS、Ctr+MはCRなんです。特にHとMはMacでは殆どの文字入力で通用しますから、ホームポジションから手を離すのが嫌いな私はBSとCRの代わりに多用しています。ごっつー楽です。


2000-02-14 2000-05-11 2002-01-20 2002-02-16 2004-04-07