memo.xight.org

/ / memo.xight.org

2006-06-19

UTF-8で変換できない機種依存文字を置換する

- Summary
UTF-8 のページから (株) や ローマ数字の I などの文字をメールで送信すると,文字化けする.
文字化けしそうな文字を,ad hoc に機種依存しない文字に変換する.
ローマ数字もカッコで括るか,スペースを挿入したほうが良いかも.

- Source
function replaceText($str){
	$arr = array(
		/* --- 0x2100 - 0x2138 (文字種記号) --- */
		// 0x2100 - 0x210F
		'\xE2\x84\x80' => 'a/c',
		'\xE2\x84\x81' => 'a/s',
		'\xE2\x84\x82' => 'C',
		'\xE2\x84\x83' => '?',
		'\xE2\x84\x84' => '?',
		'\xE2\x84\x85' => 'c/o',
		'\xE2\x84\x86' => 'c/u',
		'\xE2\x84\x87' => '?',
		'\xE2\x84\x88' => '?',
		'\xE2\x84\x89' => 'F',
		'\xE2\x84\x8A' => 'g',
		'\xE2\x84\x8B' => '?',
		'\xE2\x84\x8C' => '?',
		'\xE2\x84\x8D' => '?',
		'\xE2\x84\x8E' => '?',
		'\xE2\x84\x8F' => '?',
		// 0x2110 - 0x211F
		'\xE2\x84\x90' => '?',
		'\xE2\x84\x91' => '?',
		'\xE2\x84\x92' => '?',
		'\xE2\x84\x93' => '?',
		'\xE2\x84\x94' => '?',
		'\xE2\x84\x95' => '?',
		'\xE2\x84\x96' => 'No.',
		'\xE2\x84\x97' => '?',
		'\xE2\x84\x98' => '?',
		'\xE2\x84\x99' => '?',
		'\xE2\x84\x9A' => '?',
		'\xE2\x84\x9B' => '?',
		'\xE2\x84\x9C' => '?',
		'\xE2\x84\x9D' => '?',
		'\xE2\x84\x9E' => '?',
		'\xE2\x84\x9F' => '?',
		// 0x2120 - 0x212F
		'\xE2\x84\xA0' => 'SM',
		'\xE2\x84\xA1' => 'TEL',
		'\xE2\x84\xA2' => 'TM',
		'\xE2\x84\xA3' => '?',
		'\xE2\x84\xA4' => '?',
		'\xE2\x84\xA5' => '?',
		'\xE2\x84\xA6' => '?',
		'\xE2\x84\xA7' => '?',
		'\xE2\x84\xA8' => '?',
		'\xE2\x84\xA9' => '?',
		'\xE2\x84\xAA' => '?',
		'\xE2\x84\xAB' => '?',
		'\xE2\x84\xAC' => '?',
		'\xE2\x84\xAD' => '?',
		'\xE2\x84\xAE' => '?',
		'\xE2\x84\xAF' => '?',
		// 0x2130 - 0x2138
		'\xE2\x84\xB0' => 'e',
		'\xE2\x84\xB1' => '?',
		'\xE2\x84\xB2' => '?',
		'\xE2\x84\xB3' => 'M',
		'\xE2\x84\xB4' => 'o',
		'\xE2\x84\xB5' => '?',
		'\xE2\x84\xB6' => '?',
		'\xE2\x84\xB7' => '?',
		'\xE2\x84\xB8' => '?',
		
		/* ref
		* 機種依存文字とUnicode - WebStudio
		* http://www.d-toybox.com/studio/lib/romanNumerals.html
		*/
		/* --- 0x2150 - 0x2183 (数字の形) --- */
		// 0x2153 - 0x215F (分数)
		'\xE2\x85\x93' => '1/3',
		'\xE2\x85\x94' => '2/3',
		'\xE2\x85\x95' => '1/5',
		'\xE2\x85\x96' => '2/5',
		'\xE2\x85\x97' => '3/5',
		'\xE2\x85\x98' => '4/5',
		'\xE2\x85\x99' => '1/6',
		'\xE2\x85\x9A' => '5/6',
		'\xE2\x85\x9B' => '1/8',
		'\xE2\x85\x9C' => '3/8',
		'\xE2\x85\x9D' => '5/8',
		'\xE2\x85\x9E' => '7/8',
		'\xE2\x85\x9F' => '1/ ',
		
		// 0x2160 - 0x216F (ローマ数字 : 大文字)
		'\xE2\x85\xA0' => 'I',
		'\xE2\x85\xA1' => 'II',
		'\xE2\x85\xA2' => 'III',
		'\xE2\x85\xA3' => 'IV',
		'\xE2\x85\xA4' => 'V',
		'\xE2\x85\xA5' => 'VI',
		'\xE2\x85\xA6' => 'VII',
		'\xE2\x85\xA7' => 'VIII',
		'\xE2\x85\xA8' => 'IX',
		'\xE2\x85\xA9' => 'X',
		'\xE2\x85\xAA' => 'XI',
		'\xE2\x85\xAB' => 'XII',
		'\xE2\x85\xAC' => 'L',
		'\xE2\x85\xAD' => 'C',
		'\xE2\x85\xAE' => 'D',
		'\xE2\x85\xAF' => 'M',
		
		// 0x2170 - 0x217F (ローマ数字 : 小文字)
		'\xE2\x85\xB0' => 'i',
		'\xE2\x85\xB1' => 'ii',
		'\xE2\x85\xB2' => 'iii',
		'\xE2\x85\xB3' => 'iv',
		'\xE2\x85\xB4' => 'v',
		'\xE2\x85\xB5' => 'vi',
		'\xE2\x85\xB6' => 'vii',
		'\xE2\x85\xB7' => 'viii',
		'\xE2\x85\xB8' => 'ix',
		'\xE2\x85\xB9' => 'x',
		'\xE2\x85\xBA' => 'xi',
		'\xE2\x85\xBB' => 'xii',
		'\xE2\x85\xBC' => 'l',
		'\xE2\x85\xBD' => 'c',
		'\xE2\x85\xBE' => 'd',
		'\xE2\x85\xBF' => 'm',
		
		// 0x2180 - 0x2182 (ローマ数字: 別表記)
		'\xE2\x86\x80' => 'M',
		'\xE2\x86\x81' => '(5000)',
		'\xE2\x86\x82' => '(10000)',
		
		/* --- 0x2190 - 0x219F (矢印) --- */
		// 0x2190 - 0x219F
		'\xE2\x86\x90' => '->',
		'\xE2\x86\x91' => '(上矢印)',
		'\xE2\x86\x92' => '<-',
		'\xE2\x86\x93' => '(下矢印)',
		'\xE2\x86\x94' => '<->',
		'\xE2\x86\x95' => '(上下矢印)',
		'\xE2\x86\x96' => '(左上矢印)',
		'\xE2\x86\x97' => '(右上矢印)',
		'\xE2\x86\x98' => '(右下矢印)',
		'\xE2\x86\x99' => '(左下矢印)',
		'\xE2\x86\x9A' => '<-/-',
		'\xE2\x86\x9B' => '-/->',
		'\xE2\x86\x9C' => '<~',
		'\xE2\x86\x9D' => '~>',
		'\xE2\x86\x9E' => '<<--',
		'\xE2\x86\x9F' => '-->>',
		
		/* --- 0x2460 - 0x24EF (囲み英数字) --- */
		// 0x2460 - 0x246F
		'\xE2\x91\xA0' => '(1)',
		'\xE2\x91\xA1' => '(2)',
		'\xE2\x91\xA2' => '(3)',
		'\xE2\x91\xA3' => '(4)',
		'\xE2\x91\xA4' => '(5)',
		'\xE2\x91\xA5' => '(6)',
		'\xE2\x91\xA6' => '(7)',
		'\xE2\x91\xA7' => '(8)',
		'\xE2\x91\xA8' => '(9)',
		'\xE2\x91\xA9' => '(10)',
		'\xE2\x91\xAA' => '(11)',
		'\xE2\x91\xAB' => '(12)',
		'\xE2\x91\xAC' => '(13)',
		'\xE2\x91\xAD' => '(14)',
		'\xE2\x91\xAE' => '(15)',
		'\xE2\x91\xAF' => '(16)',
		
		// 0x2470 - 0x247F
		'\xE2\x91\xB0' => '(17)',
		'\xE2\x91\xB1' => '(18)',
		'\xE2\x91\xB2' => '(19)',
		'\xE2\x91\xB3' => '(20)',
		'\xE2\x91\xB4' => '(1)',
		'\xE2\x91\xB5' => '(2)',
		'\xE2\x91\xB6' => '(3)',
		'\xE2\x91\xB7' => '(4)',
		'\xE2\x91\xB8' => '(5)',
		'\xE2\x91\xB9' => '(6)',
		'\xE2\x91\xBA' => '(7)',
		'\xE2\x91\xBB' => '(8)',
		'\xE2\x91\xBC' => '(9)',
		'\xE2\x91\xBD' => '(10)',
		'\xE2\x91\xBE' => '(11)',
		'\xE2\x91\xBF' => '(12)',
		
		// 0x2480 - 0x248F
		'\xE2\x92\x80' => '(13)',
		'\xE2\x92\x81' => '(14)',
		'\xE2\x92\x82' => '(15)',
		'\xE2\x92\x83' => '(16)',
		'\xE2\x92\x84' => '(17)',
		'\xE2\x92\x85' => '(18)',
		'\xE2\x92\x86' => '(19)',
		'\xE2\x92\x87' => '(20)',
		'\xE2\x92\x88' => '1.',
		'\xE2\x92\x89' => '2.',
		'\xE2\x92\x8A' => '3.',
		'\xE2\x92\x8B' => '4.',
		'\xE2\x92\x8C' => '5.',
		'\xE2\x92\x8D' => '6.',
		'\xE2\x92\x8E' => '7.',
		'\xE2\x92\x8F' => '8.',
		
		// 0x2490 - 0x249F
		'\xE2\x92\x90' => '9.',
		'\xE2\x92\x91' => '10.',
		'\xE2\x92\x92' => '11.',
		'\xE2\x92\x93' => '12.',
		'\xE2\x92\x94' => '13.',
		'\xE2\x92\x95' => '14.',
		'\xE2\x92\x96' => '15.',
		'\xE2\x92\x97' => '16.',
		'\xE2\x92\x98' => '17.',
		'\xE2\x92\x99' => '18.',
		'\xE2\x92\x9A' => '19.',
		'\xE2\x92\x9B' => '20.',
		'\xE2\x92\x9C' => '(a)',
		'\xE2\x92\x9D' => '(b)',
		'\xE2\x92\x9E' => '(c)',
		'\xE2\x92\x9F' => '(d)',
		
		// 0x24A0 - 0x24AF
		'\xE2\x92\xA0' => '(e)',
		'\xE2\x92\xA1' => '(f)',
		'\xE2\x92\xA2' => '(g)',
		'\xE2\x92\xA3' => '(h)',
		'\xE2\x92\xA4' => '(i)',
		'\xE2\x92\xA5' => '(j)',
		'\xE2\x92\xA6' => '(k)',
		'\xE2\x92\xA7' => '(l)',
		'\xE2\x92\xA8' => '(m)',
		'\xE2\x92\xA9' => '(n)',
		'\xE2\x92\xAA' => '(o)',
		'\xE2\x92\xAB' => '(p)',
		'\xE2\x92\xAC' => '(q)',
		'\xE2\x92\xAD' => '(r)',
		'\xE2\x92\xAE' => '(s)',
		'\xE2\x92\xAF' => '(t)',
		
		// 0x24B0 - 0x24BF
		'\xE2\x92\xB0' => '(u)',
		'\xE2\x92\xB1' => '(v)',
		'\xE2\x92\xB2' => '(w)',
		'\xE2\x92\xB3' => '(x)',
		'\xE2\x92\xB4' => '(y)',
		'\xE2\x92\xB5' => '(z)',
		'\xE2\x92\xB6' => '(A)',
		'\xE2\x92\xB7' => '(B)',
		'\xE2\x92\xB8' => '(C)',
		'\xE2\x92\xB9' => '(D)',
		'\xE2\x92\xBA' => '(E)',
		'\xE2\x92\xBB' => '(F)',
		'\xE2\x92\xBC' => '(G)',
		'\xE2\x92\xBD' => '(H)',
		'\xE2\x92\xBE' => '(I)',
		'\xE2\x92\xBF' => '(J)',
		
		// 0x24C0 - 0x24CF
		'\xE2\x93\x80' => '(K)',
		'\xE2\x93\x81' => '(L)',
		'\xE2\x93\x82' => '(M)',
		'\xE2\x93\x83' => '(N)',
		'\xE2\x93\x84' => '(O)',
		'\xE2\x93\x85' => '(P)',
		'\xE2\x93\x86' => '(Q)',
		'\xE2\x93\x87' => '(R)',
		'\xE2\x93\x88' => '(S)',
		'\xE2\x93\x89' => '(T)',
		'\xE2\x93\x8A' => '(U)',
		'\xE2\x93\x8B' => '(V)',
		'\xE2\x93\x8C' => '(W)',
		'\xE2\x93\x8D' => '(X)',
		'\xE2\x93\x8E' => '(Y)',
		'\xE2\x93\x8F' => '(Z)',
		
		// 0x24D0 - 0x24DF
		'\xE2\x93\x90' => '(a)',
		'\xE2\x93\x91' => '(b)',
		'\xE2\x93\x92' => '(c)',
		'\xE2\x93\x93' => '(d)',
		'\xE2\x93\x94' => '(e)',
		'\xE2\x93\x95' => '(f)',
		'\xE2\x93\x96' => '(g)',
		'\xE2\x93\x97' => '(h)',
		'\xE2\x93\x98' => '(i)',
		'\xE2\x93\x99' => '(j)',
		'\xE2\x93\x9A' => '(k)',
		'\xE2\x93\x9B' => '(l)',
		'\xE2\x93\x9C' => '(m)',
		'\xE2\x93\x9D' => '(n)',
		'\xE2\x93\x9E' => '(o)',
		'\xE2\x93\x9F' => '(p)',
		
		// 0x24E0 - 0x24EF
		'\xE2\x93\xA0' => '(q)',
		'\xE2\x93\xA1' => '(r)',
		'\xE2\x93\xA2' => '(s)',
		'\xE2\x93\xA3' => '(t)',
		'\xE2\x93\xA4' => '(u)',
		'\xE2\x93\xA5' => '(v)',
		'\xE2\x93\xA6' => '(w)',
		'\xE2\x93\xA7' => '(x)',
		'\xE2\x93\xA8' => '(y)',
		'\xE2\x93\xA9' => '(z)',
		'\xE2\x93\xAA' => '(0)',
		'\xE2\x93\xAB' => '(11)',
		'\xE2\x93\xAC' => '(12)',
		'\xE2\x93\xAD' => '(13)',
		'\xE2\x93\xAE' => '(14)',
		'\xE2\x93\xAF' => '(15)',
		
		/* --- 0x2600 - 0x266F (その他の記号) --- */
		// 0x2600 - 0x260F
		'\xE2\x98\x80' => '(晴)',
		'\xE2\x98\x81' => '(曇)',
		'\xE2\x98\x82' => '(雨)',
		'\xE2\x98\x83' => '(雪)',
		'\xE2\x98\x84' => '?',
		'\xE2\x98\x85' => '(黒星)',
		'\xE2\x98\x86' => '(白星)',
		'\xE2\x98\x87' => '?',
		'\xE2\x98\x88' => '?',
		'\xE2\x98\x89' => '?',
		'\xE2\x98\x8A' => '?',
		'\xE2\x98\x8B' => '?',
		'\xE2\x98\x8C' => '?',
		'\xE2\x98\x8D' => '?',
		'\xE2\x98\x8E' => '(黒電話)',
		'\xE2\x98\x8F' => '(白電話)',
		// 0x2610 - 0x2613
		'\xE2\x98\x90' => '(チェックボックス 空欄)',
		'\xE2\x98\x91' => '(チェックボックス チェック)',
		'\xE2\x98\x92' => '(チェックボックス チェック)',
		'\xE2\x98\x93' => '(チェック)',
		
		// 0x261A - 0x261F
		'\xE2\x98\x9A' => '(左)',
		'\xE2\x98\x9B' => '(右)',
		'\xE2\x98\x9C' => '(左)',
		'\xE2\x98\x9D' => '(上)',
		'\xE2\x98\x9E' => '(右)',
		'\xE2\x98\x9F' => '(下)',
		// 0x2620 - 0x262F
		'\xE2\x98\xA0' => '(ドクロ)',
		'\xE2\x98\xA1' => '?',
		'\xE2\x98\xA2' => '(核)',
		'\xE2\x98\xA3' => '?',
		'\xE2\x98\xA4' => '?',
		'\xE2\x98\xA5' => '?',
		'\xE2\x98\xA6' => '?',
		'\xE2\x98\xA7' => '?',
		'\xE2\x98\xA8' => '?',
		'\xE2\x98\xA9' => '?',
		'\xE2\x98\xAA' => '?',
		'\xE2\x98\xAB' => '?',
		'\xE2\x98\xAC' => '?',
		'\xE2\x98\xAD' => '?',
		'\xE2\x98\xAE' => '?',
		'\xE2\x98\xAF' => '?',
		// 0x2630 - 0x263F
		'\xE2\x98\xB0' => '?',
		'\xE2\x98\xB1' => '?',
		'\xE2\x98\xB2' => '?',
		'\xE2\x98\xB3' => '?',
		'\xE2\x98\xB4' => '?',
		'\xE2\x98\xB5' => '?',
		'\xE2\x98\xB6' => '?',
		'\xE2\x98\xB7' => '?',
		'\xE2\x98\xB8' => '?',
		'\xE2\x98\xB9' => '?',
		'\xE2\x98\xBA' => '?',
		'\xE2\x98\xBB' => '?',
		'\xE2\x98\xBC' => '?',
		'\xE2\x98\xBD' => '?',
		'\xE2\x98\xBE' => '?',
		'\xE2\x98\xBF' => '?',
		// 0x2640 - 0x264F
		'\xE2\x99\x80' => '?',
		'\xE2\x99\x81' => '?',
		'\xE2\x99\x82' => '?',
		'\xE2\x99\x83' => '?',
		'\xE2\x99\x84' => '?',
		'\xE2\x99\x85' => '?',
		'\xE2\x99\x86' => '?',
		'\xE2\x99\x87' => '?',
		'\xE2\x99\x88' => '(おひつじ座)',
		'\xE2\x99\x89' => '(おうし座)',
		'\xE2\x99\x8A' => '(ふたご座)',
		'\xE2\x99\x8B' => '(かに座)',
		'\xE2\x99\x8C' => '(しし座)',
		'\xE2\x99\x8D' => '(おとめ座)',
		'\xE2\x99\x8E' => '(てんびん座)',
		'\xE2\x99\x8F' => '(さそり座)',
		// 0x2650 - 0x265F
		'\xE2\x99\x90' => '(いて座)',
		'\xE2\x99\x91' => '(やぎ座)',
		'\xE2\x99\x92' => '(みずがめ座)',
		'\xE2\x99\x93' => '(うお座)',
		'\xE2\x99\x94' => '(キング 白)',
		'\xE2\x99\x95' => '(クイーン 白)',
		'\xE2\x99\x96' => '(ルーク 白)',
		'\xE2\x99\x97' => '(ビショップ 白)',
		'\xE2\x99\x98' => '(ナイト 白)',
		'\xE2\x99\x99' => '(ポーン 白)',
		'\xE2\x99\x9A' => '(キング 黒)',
		'\xE2\x99\x9B' => '(クイーン 黒)',
		'\xE2\x99\x9C' => '(ルーク 黒)',
		'\xE2\x99\x9D' => '(ビショップ 黒)',
		'\xE2\x99\x9E' => '(ナイト 黒)',
		'\xE2\x99\x9F' => '(ポーン 黒)',
		// 0x2660 - 0x266F
		'\xE2\x99\xA0' => '(スペード)',
		'\xE2\x99\xA1' => '(ハード)',
		'\xE2\x99\xA2' => '(ダイヤ)',
		'\xE2\x99\xA3' => '(クラブ)',
		'\xE2\x99\xA4' => '(スペード)',
		'\xE2\x99\xA5' => '(ハード)',
		'\xE2\x99\xA6' => '(ダイヤ)',
		'\xE2\x99\xA7' => '(クラブ)',
		'\xE2\x99\xA8' => '(温泉)',
		'\xE2\x99\xA9' => '(4分音符)',
		'\xE2\x99\xAA' => '(8分音符)',
		'\xE2\x99\xAB' => '(2つの8分音符)',
		'\xE2\x99\xAC' => '(2つの16分音符)',
		'\xE2\x99\xAD' => '(フラット)',
		'\xE2\x99\xAE' => '(ナチュラル)',
		'\xE2\x99\xAF' => '(シャープ)',
		
		/* --- 0x3220 - 0x324F (囲みCJK文字/月) --- */
		// 0x3220 - 0x322F
		'\xE3\x88\xA0' => '(一)',
		'\xE3\x88\xA1' => '(二)',
		'\xE3\x88\xA2' => '(三)',
		'\xE3\x88\xA3' => '(四)',
		'\xE3\x88\xA4' => '(五)',
		'\xE3\x88\xA5' => '(六)',
		'\xE3\x88\xA6' => '(七)',
		'\xE3\x88\xA7' => '(八)',
		'\xE3\x88\xA8' => '(九)',
		'\xE3\x88\xA9' => '(十)',
		'\xE3\x88\xAA' => '(月)',
		'\xE3\x88\xAB' => '(火)',
		'\xE3\x88\xAC' => '(水)',
		'\xE3\x88\xAD' => '(木)',
		'\xE3\x88\xAE' => '(金)',
		'\xE3\x88\xAF' => '(土)',
		
		// 0x3230 - 0x323F
		'\xE3\x88\xB0' => '(日)',
		'\xE3\x88\xB1' => '(株)',
		'\xE3\x88\xB2' => '(有)',
		'\xE3\x88\xB3' => '(社)',
		'\xE3\x88\xB4' => '(名)',
		'\xE3\x88\xB5' => '(特)',
		'\xE3\x88\xB6' => '(財)',
		'\xE3\x88\xB7' => '(祝)',
		'\xE3\x88\xB8' => '(労)',
		'\xE3\x88\xB9' => '(代)',
		'\xE3\x88\xBA' => '(呼)',
		'\xE3\x88\xBB' => '(学)',
		'\xE3\x88\xBC' => '(監)',
		'\xE3\x88\xBD' => '(企)',
		'\xE3\x88\xBE' => '(資)',
		'\xE3\x88\xBF' => '(協)',
		
		// 0x3240 - 0x3243
		'\xE3\x89\x80' => '(祭)',
		'\xE3\x89\x81' => '(休)',
		'\xE3\x89\x82' => '(自)',
		'\xE3\x89\x83' => '(至)',
		
		/* --- 0x3280 - 0x33FF --- */
		// 0x3280 - 0x328F
		'\xE3\x8A\x80' => '(一)',
		'\xE3\x8A\x81' => '(二)',
		'\xE3\x8A\x82' => '(三)',
		'\xE3\x8A\x83' => '(四)',
		'\xE3\x8A\x84' => '(五)',
		'\xE3\x8A\x85' => '(六)',
		'\xE3\x8A\x86' => '(七)',
		'\xE3\x8A\x87' => '(八)',
		'\xE3\x8A\x88' => '(九)',
		'\xE3\x8A\x89' => '(十)',
		'\xE3\x8A\x8A' => '(月)',
		'\xE3\x8A\x8B' => '(火)',
		'\xE3\x8A\x8C' => '(水)',
		'\xE3\x8A\x8D' => '(木)',
		'\xE3\x8A\x8E' => '(金)',
		'\xE3\x8A\x8F' => '(土)',
		// 0x3290 - 0x329F
		'\xE3\x8A\x90' => '(日)',
		'\xE3\x8A\x91' => '(株)',
		'\xE3\x8A\x92' => '(有)',
		'\xE3\x8A\x93' => '(社)',
		'\xE3\x8A\x94' => '(名)',
		'\xE3\x8A\x95' => '(特)',
		'\xE3\x8A\x96' => '(財)',
		'\xE3\x8A\x97' => '(祝)',
		'\xE3\x8A\x98' => '(労)',
		'\xE3\x8A\x99' => '(秘)',
		'\xE3\x8A\x9A' => '(男)',
		'