vWFNgɂ
									2004.JAN.02 JE3HHT X   
									2004.JAN.12 JE3HHT X   

͂߂
  ͓{lȂ̂œ{ł̉bDłBPSK31ɂĂǓmł΂ł邾{ŉb܂Bm̒ʂAPSK31͑f炵`łA{`ꍇA኱̖肪邱ƂCɂȂĂ܂Bđ̓AWAninOAjłƍl܂B
@̃vWFNǵA̖ጸ@ɂčl@A邱ƂړIƂ܂B

R[hƕ\
  AWAn({AnOA)͕̂8BitsR[hP̂ŕ\邱ƂłÂ݂ƂPSK31łMBCS(Multibyte Character Set, {̏ꍇShift-JIS)ƌĂ΂QoCggē`Ă܂i̕QAƌĂԂƂɂ܂jB`͂QłPɂȂłAȉ̂悤ȕss܂B

	1)`xxȂB
	2)̈ʑƂ܂ႤɂȂȀԂ炵΂炭񕜂łȂB
	3)قȂ镶݂̂̕ŁABSiobNXy[Xj̈sɂȂB

  (1)AWAn̏ꍇA舵̂łx͎dȂƂ͎v܂AMBCŜPoCgڂ$81-$FEɊ蓖ĂĂ邱ƂPSK31ł͂sɂȂĂ܂B܂{ł͏opx̍Ђ炪Ȃ̂QoCgڂ$9F-$F2Ɋ蓖ĂĂ̂ǂ܂B͈̔͂PSK31VARICODE̒ł`Ă邩łB܂MBCSPɑ΂ĂQVARICODE`̂ŁAԂɗ]GAP(00)ǉ܂iv24bitsx̕ɂȂĂ܂jB
  ۂɓ{QSOĂ݂Δ܂Ȃ݂x͂܂ɂx߂inғm̘aCWɕĂjAQSÔɑȊoiHjKvɂȂ܂B`xł΁ACyɉ^pł悤ɂȂ邩m܂B

  (2)QSBQRNȂǂŔAۂɗƂĂ̂͂PȂ̂łAMł͈ʑĉAɂȂĂ܂܂BMBCSPڂƂQڂɓ͈͂̃R[h݂邽߂ɁA҂̈ʑmɋʂ邱ƂłȂłBK{ł$A0-$DFɂMBCSPڂ̃R[h蓖ĂĂ炸͈̔͂łʑ킹邱Ƃł܂AnO⒆łMBCSPڂƂQڂ̃R[h̏dȂ͈͂{傫̂ŁAʑ̕AɓȂƍl܂B

  (3)AvP[V猩ꍇAPoCgƂQoCgPoCgPʂō݂ē`邽߁ABS̎舵Ȃ܂B{ΉPSK31̃\tgiHALPSKWINPSK/JȂǁjł͍IɂĂ܂A{AvP[VJ҂͂̂悤ȏɎԂgׂł͂܂B

@̖ጸłʓIȕ@́A`̕\𑝂₵A舵̂PKP̕Pʂœ`ł悤ɂ邱ƂłBPSK31ŎgĂVARICODE͌アł̌𑝂₷Ƃł܂A͕s\ł͂܂B

  舵R[hMBCSɌꍇA$00-$FF$8140-$FEFF͈̔͂Ηǂ̂16Bitsł̕\ׂ͈͂̂Ă̌KvȖł͂܂B܂ׂĂMBCS̑2oCgɂ$40̃R[h݂͑Ȃ̂ŁAׂ͈̔͂č폜ł܂B{Ɍ$A040-$DFFFɂMBCS݂Ȃ̂ŁAXɌ炷Ƃł܂AnO⒆ł͈͂̔͂ɂ`Ă܂̂ŁA̍̕폜͍sȂɂ܂B

  舵R[hUnicodeɂꍇ$0000-$FFFF܂łׂ̂Ă͈̔͂̕R[h`łKv܂BUnicode͂P̃R[hɁAtHg̃LN^ZbgɈˑȂB̕蓖ĂĂ̂ŁAMƎMŕǨ`vƂ܂B͎ۂ̉^pœ{nOAS`}[œɓ`悤ȂƂ͂܂񂵁AVARICODE𐶐ۂɌɂsiႦVARICODECfbNX̂܂ܕR[hɊ蓖ĂƁAUnicodě㔼ɕWĂnO̕ȂjĂ܂܂B܂Unicodeׂ͂ĂWindowsŃT|[gĂł͂܂񂩂A͂̕R[h͎舵Ȃɂ܂B

舵R[hAJISR[hɂ邱Ƃ\łÃR[h͓{ȊO̓AWAn̎܂lĂȂ̂ŃA}`Aɂ͌ȂƎv܂B

@MBCS$00-$FF$8140-$FEFF͈̔͂VARICODEɕϊ邽߁AACfbNXlŕ\ƁA$0000-$5F7F̘Alɕϊ邱Ƃł܂B
@VARICODE͗[PŁAOQȏAȂƂKŐ܂B镄́AEl߂ŔrĒlقCfbNXlɂ̂Ƃ܂B̂悤ɕׂ΁AVARICODECfbNXɕϊۂɓ񕪒TASYgƂł܂B

Index	VARICODE
$0000	1
$0001	11
$0002	101
$0003	111
$0004	1011
$0005	1101
$0006	1111
$0007	10101
$0008	10111
$0009	11011
$000A	11101
$000B	11111
  :	  :
$00FF	101101011011
  :	  :
$5F7F	110111111111101101101

@CfbNX̏Ԃ̂܂ܕR[hɊ蓖ĂƁA܂gȂ($00)ZɂȂA`ꍇɔłBPSK31ł$0000-$007F܂(ASCII)͉̏̕opxɂčœKĂ܂̂ŁA͈̔͂ɂĂPSK31ƓϊsƂɂ܂B

  ĂŎʏg{ɒڂȀopx𒲂ׂĂ݂܂傤BɎ̂MBCŜPoCgڂɑ΂镶̏opx𒲂ׂłBߋɍ쐬̕iꕶj𒲂ׂ܂ׂēXłB

	$81 : 6.33%	$89 : 0.95%	$91 : 2.44%	$99 : 0.00%
	$82 : 51.5%	$8A : 1.68%	$92 : 2.12%	$9A : 0.00%
	$83 : 8.99%	$8B : 0.54%	$93 : 2.93%	$9B : 0.00%
	$84 : 0.00%	$8C : 1.79%	$94 : 1.74%	$9C : 0.00%
	$85 : 0.00%	$8D : 2.66%	$95 : 4.51%	$9D : 0.00%
	$86 : 0.00%	$8E : 3.75%	$96 : 1.22%	$9E : 0.00%
	$87 : 0.00%	$8F : 1.47%	$97 : 1.38%	$9F : 0.00%
	$88 : 1.68%	$90 : 2.04%	$98 : 0.24%	

	$E0 : 0.00%	$E8 : 0.00%	$F0 : 0.00%	$F8 : 0.00%
	$E1 : 0.00%	$E9 : 0.00%	$F1 : 0.00%	$F9 : 0.00%
	$E2 : 0.00%	$EA : 0.00%	$F2 : 0.00%	$FA : 0.00%
	$E3 : 0.00%	$EB : 0.00%	$F3 : 0.00%	$FB : 0.00%
	$E4 : 0.00%	$EC : 0.00%	$F4 : 0.00%	$FC : 0.00%
	$E5 : 0.00%	$ED : 0.00%	$F5 : 0.00%	$FD : 0.00%
	$E6 : 0.00%	$EE : 0.00%	$F6 : 0.00%	$FE : 0.00%
	$E7 : 0.00%	$EF : 0.00%	$F7 : 0.00%	

@̕z܂ɌƁAR[h̑Ȍ̕omA㔼ij̏om͒ႭȂĂ܂BVARICODECfbNXɕR[h̏Ԃŕ蓖Ă̂ɍDsłƌ܂B
@ׂώ@ƂTOȏ̕$82xxɏWĂ邱ƂɋC܂B͈͂̔͂͂Ђ炪ȂɑA̓_{̓iЂ炪ȁAt@xbgjłAbiꕶjł͂VO炢Ђ炪ȂłƌĂ܂B܂Ђ炪ȂɒZ蓖Ă΁A{Ɍ΍XȂ`x̉P}͂łB܂A}`Ał̉bɌ΃J^JigXɂ܂AZĂƌʂƍl܂B

@Ђ炪ȂMBCS$829F-$82F2ACfbNXł$021F-$0272ɒ`Ă܂B͈̔͂̃CfbNXPVARICODEɕϊGAP܂߂15-16bitsɂȂ܂Aʏ̕ƂĂ͂܂gĂȂ$0080-$00D3͈̔͂Ɋ蓖Ă12-13Bitsōς܂Ƃł܂BJ^Ji̓CfbNX$0280-$02D6iMBCS$8340-$8396jɊ蓖ĂĂA͈̔͂$00D4-$012AƓւ܂B

@āA̕ϊsꍇ̓{ȊOMBCSinOAȂǁjɗ^e͂ǂł傤H@Ă݂Ƃ̂ł$0081-$00FEɂ͂Ƃƕ`Ă炸iMBCS̑oCgƂĒ`Ăj͈̔͂͂܂肠܂B$0100-$012A(MBCSł$8140-$816A)͈̔͂łA̕̕iHLBYŒ`Ăj̏opxǂ̒xȂ͎̂ɂ͔܂B܂pȊO̔MBCS̏ꍇɂ$0080-$00FF͈̔͂ɏpR[h蓖ĂĂ\܂̂ŁAɂĂM̃tHgɂĂ̕ϊsǂIɔ肷̂ǂłB
  ܂tHgɂĕϊ@ύXKv̂Ȃ΁Ałɓ{$E040-$FEFF$A040-$BEFFi͈͓̔͂{ɂ͕݂Ȃj͈̔͂ɑւĂ܂܂傤B͈̔͂̕͏om͒Ⴂłł͗LɂȂ邩m܂BCfNbXł$4840-$5F7F$1840-$2F7FƓւ܂B

@CfbNXϊ@ȉɂ܂Ƃ߂܂B

	$0000-$007F	PSK31̕ϊe[uQ
	$0080-$00D3	$021F-$0272ɕϊ(tHg{̏ꍇ̂)
	$00D4-$012A	$0280-$02D6ɕϊ(tHg{̏ꍇ̂)
	$012B-$021E	̂܂܊蓖
	$021F-$0272	$0080-$00D3ɕϊ(tHg{̏ꍇ̂)
	$0273-$027F	̂܂܊蓖
	$0280-$02D6	$00D4-$012Aɕϊ(tHg{̏ꍇ̂)
	$02D7-$183F	̂܂܊蓖
	$1840-$2F7F	$4840-$5F7Fɕϊ(tHg{̏ꍇ̂)
	$2F80-$483F	̂܂܊蓖
	$4840-$5F7F	$1840-$2F7Fɕϊ(tHg{̏ꍇ̂)

@̕@ŕ𐶐ꍇ̍ł́A
	$5F7F	110111111111101101101	(21Bits)
ɂȂ܂B
@Ȃ{ł̍Ṓ̕A
	$2F7F	10110101111111101111 	(20Bits)
ɂȂ܂B


ϒ
@PSK31œ{`ꍇAMBCSQAœ`̂Wi͊̕FjɂȂĂɈʓIɍLgĂ܂BčVARICODEPSK31ɍڂĂ܂ƁAMBCSɊւĊ̃\tgƌ݊ƂȂȂD܂܂B

@Ŏu̕ϒƂGMSKiBT=1.0j̗p邱Ƃɂ܂BGMSK͓Ȍ`FSKƂčl邱Ƃł܂AނPSK̂FB̂悤Ȃ̂łBMPSK31ƎĂ܂ÃXyNg̓PSK31Ƃ͈قȂ܂AMŃXyNg\Ή^p͗҂̋ʂ\ƍl܂B
  ܂GMSKPSK31̂悤ȐU͎Ȃ̂ŁAM@̃jAeBvȂƂbgi̓_FB...j܂B

@GMSKɍڂꍇAPSK31Ɠ悤ɂOŃV{𔽓]APŃV{ێɂ܂BĂΖ@̃we_CiUSB/LSBj̏ԂɊ֌WȂ邱Ƃł܂BGMSK͖̂̂̎{vWFNg̖ړIł͂܂̂ŁAڍׂɂĂ͖{ł͊܂i̎QlQƂĉjB


u
  uƂPC̃TEhJ[hvO쐻邱Ƃɂ܂BVARICODE̎ړIȂ̂ŁAʂ͈ȉ̂悤ȕjɂ܂B

  E@\QSOŝɕKvȔ͈͂ƂB
  E錾ij[Ȃǁj͓ʂ͓{݂̂Ƃ邪AMɂĂׂ͂ĂMBCS`\ipꌗȂǂ̔MBCSgnłPSK31Ŗ͂Ȃ̂Ŗ{vWFNg͈ӖȂȂjB

@pmFꂽiKŁA쐫܂߂ăvỎPGW̍쐬lƎv܂B


t^
  ȉɃCfbNX̕ϊvO̗܂B

static int SwapHiragana(int index)
{
	if( index <= 0x00d3 ){					// $80-$D3
		index += 0x21f - 0x0080;	// $80-$D3 to Hiragana
	}
	else if( index <= 0x12a ){					// $D4-$12A
		index += 0x280 - 0x00d4;	// $D4-$12A to Katakana
	}
	else if( (index >= 0x021f) && (index <= 0x0272) ){	// Hiragana
		index -= 0x21f - 0x0080;	// Hiragana to $80-$D3
	}
	else if( (index >= 0x0280) && (index <= 0x02d6) ){	// Katakana
		index -= 0x280 - 0x00d4;	// Katakana to $D4-$12A
	}
	else if( (index >= 0x1840) && (index <= 0x2f7f) ){
		index += 0x4840 - 0x1840;
	}
	else if( (index >= 0x4840) && (index <= 0x5f7f) ){
		index -= 0x4840 - 0x1840;
	}
}

UINT Index2Mbc(int index, BOOL fJA)
{
const BYTE _tIndex2Ascii[]={
	0x20,0x65,0x74,0x6F,0x61,0x69,0x6E,0x72,	/*00*/
	0x73,0x6C,0x0A,0x0D,0x68,0x64,0x63,0x2D,	/*08*/
	0x75,0x6D,0x66,0x70,0x3D,0x2E,0x67,0x79,	/*10*/
	0x62,0x77,0x54,0x53,0x2C,0x45,0x76,0x41,	/*18*/
	0x49,0x4F,0x43,0x52,0x44,0x30,0x4D,0x31,	/*20*/
	0x6B,0x50,0x4C,0x46,0x4E,0x78,0x42,0x32,	/*28*/
	0x09,0x3A,0x29,0x28,0x47,0x33,0x48,0x55,	/*30*/
	0x35,0x57,0x22,0x36,0x5F,0x2A,0x58,0x34,	/*38*/
	0x59,0x4B,0x27,0x38,0x37,0x2F,0x56,0x39,	/*40*/
	0x7C,0x3B,0x71,0x7A,0x3E,0x24,0x51,0x2B,	/*48*/
	0x6A,0x3C,0x5C,0x23,0x5B,0x5D,0x4A,0x21,	/*50*/
	0x00,0x5A,0x3F,0x7D,0x7B,0x26,0x40,0x5E,	/*58*/
	0x25,0x7E,0x01,0x0C,0x60,0x04,0x02,0x06,	/*60*/
	0x11,0x10,0x1E,0x07,0x08,0x1B,0x17,0x14,	/*68*/
	0x1C,0x05,0x15,0x16,0x0B,0x0E,0x03,0x18,	/*70*/
	0x19,0x1F,0x0F,0x12,0x13,0x7F,0x1A,0x1D,	/*78*/
};

	if( index <= 0x007f ){
		index = _tIndex2Ascii[index];
	}
	else if( fJA ){
		index = SwapHiragana(index);
	}

	UINT mbc;
	int m, b;
	if( index >= 0x0100 ){
		index -= 0x0100;
		m = index % 192;
		b = index / 192;
		mbc = 0x8140 + m + (b * 256);
	}
	else {
		mbc = index;
	}
	return mbc;
}

int Mbc2Index(UINT mbc, BOOL fJA)
{
const BYTE _tAscii2Index[]={
	0x58,0x62,0x66,0x76,0x65,0x71,0x67,0x6B,	/*00*/
	0x6C,0x30,0x0A,0x74,0x63,0x0B,0x75,0x7A,	/*08*/
	0x69,0x68,0x7B,0x7C,0x6F,0x72,0x73,0x6E,	/*10*/
	0x77,0x78,0x7E,0x6D,0x70,0x7F,0x6A,0x79,	/*18*/
	0x00,0x57,0x3A,0x53,0x4D,0x60,0x5D,0x42,	/*20*/
	0x33,0x32,0x3D,0x4F,0x1C,0x0F,0x15,0x45,	/*28*/
	0x25,0x27,0x2F,0x35,0x3F,0x38,0x3B,0x44,	/*30*/
	0x43,0x47,0x31,0x49,0x51,0x14,0x4C,0x5A,	/*38*/
	0x5E,0x1F,0x2E,0x22,0x24,0x1D,0x2B,0x34,	/*40*/
	0x36,0x20,0x56,0x41,0x2A,0x26,0x2C,0x21,	/*48*/
	0x29,0x4E,0x23,0x1B,0x1A,0x37,0x46,0x39,	/*50*/
	0x3E,0x40,0x59,0x54,0x52,0x55,0x5F,0x3C,	/*58*/
	0x64,0x04,0x18,0x0E,0x0D,0x01,0x12,0x16,	/*60*/
	0x0C,0x05,0x50,0x28,0x09,0x11,0x06,0x03,	/*68*/
	0x13,0x4A,0x07,0x08,0x02,0x10,0x1E,0x19,	/*70*/
	0x2D,0x17,0x4B,0x5C,0x48,0x5B,0x61,0x7D,	/*78*/
};
	int index, m, b;
	if( mbc >= 0x8100 ){
		if( (mbc & 0x00ff) >= 0x0040 ){
			mbc -= 0x8100;
			m = mbc % 256;
			b = mbc / 256;
			index = 0x100 - 0x40 + m + (b * 192);
		}
		else {
			return -1;	/* error */
		}
	}
	else {
		index = mbc;
	}
	if( index <= 0x007f ){
		index = _tAscii2Index[index];
	}
	else if( fJA ){
		index = SwapHiragana(index);
	}
	return index;
}
