開発環境 Microsoft Visual C++ 2010 Express (SP1)
実行環境 Microsoft Windows XP Home Edition (SP3)
プロジェクトの種類 Win32 コンソール アプリケーション
プロジェクト名 isprint
アプリケーションの種類 コンソール アプリケーション
追加のオプション 空のプロジェクト

同じexeファイルを実行してもWinXPとWin7では結果が異なる。
解決方法はApplication Compatibility Toolkit(ACT)を使用するか、isprint互換関数を用意するなど。

参考

isprint1.c
#include <locale.h>
#include <stdio.h>
#include <Windows.h>
 
void PrintCodeTable(void)
{
	int nHigh;
	int nLow;
	int nChar = 0;
 
	printf("   0 1 2 3 4 5 6 7 8 9 A B C D E F\n");
	for (nHigh = 0; nHigh < 16; nHigh++) {
		printf("%X_", nHigh);
		for (nLow = 0; nLow < 16; nLow++) {
			printf(" %c", isprint(nChar++) ? 'o' : '.');
		}
		printf("\n");
	}
}
 
int main()
{
	OSVERSIONINFOEX vi;
	char *psz;
 
	vi.dwOSVersionInfoSize = sizeof vi;
	GetVersionEx((LPOSVERSIONINFO)&vi);
	printf("Win%u.%u Build %u SP%u.%u\n", vi.dwMajorVersion, vi.dwMinorVersion,
		vi.dwBuildNumber, vi.wServicePackMajor, vi.wServicePackMinor);
 
	psz = setlocale(LC_CTYPE, "");
	printf("\n[%s]\n", psz);
	PrintCodeTable();
 
	return 0;
}
 

実行(WinXP Home)
Win5.1 Build 2600 SP3.0

[Japanese_Japan.932]
   0 1 2 3 4 5 6 7 8 9 A B C D E F
0_ . . . . . . . . . o . . . . . .
1_ . . . . . . . . . . . . . . . .
2_ o o o o o o o o o o o o o o o o
3_ o o o o o o o o o o o o o o o o
4_ o o o o o o o o o o o o o o o o
5_ o o o o o o o o o o o o o o o o
6_ o o o o o o o o o o o o o o o o
7_ o o o o o o o o o o o o o o o .
8_ . . . . . . . . . . . . . . . .
9_ . . . . . . . . . . . . . . . .
A_ . o o o o o o o o o o o o o o o
B_ . o o o o o o o o o o o o o o o
C_ o o o o o o o o o o o o o o o o
D_ o o o o o o o o o o o o o o . .
E_ . . . . . . . . . . . . . . . .
F_ . . . . . . . . . . . . . . . .

実行(Win7 Home)
Win6.1 Build 7601 SP1.0

[Japanese_Japan.932]
   0 1 2 3 4 5 6 7 8 9 A B C D E F
0_ . . . . . . . . . o . . . . . .
1_ . . . . . . . . . . . . . . . .
2_ o o o o o o o o o o o o o o o o
3_ o o o o o o o o o o o o o o o o
4_ o o o o o o o o o o o o o o o o
5_ o o o o o o o o o o o o o o o o
6_ o o o o o o o o o o o o o o o o
7_ o o o o o o o o o o o o o o o .
8_ . . . . . . . . . . . . . . . .
9_ . . . . . . . . . . . . . . . .
A_ . o o o o o o o o o o o o o o o
B_ o o o o o o o o o o o o o o o o
C_ o o o o o o o o o o o o o o o o
D_ o o o o o o o o o o o o o o o o
E_ . . . . . . . . . . . . . . . .
F_ . . . . . . . . . . . . . . . .



修正プログラムを試してみたが、Visual C++ .NET 2003までの情報であり解決はしなかった。
また、Application Compatibility Toolkit(ACT)を適用しても結果は同じであった。

isprint2.c
#include <locale.h>
#include <stdio.h>
#include <Windows.h>
 
// 文字種情報を変更します。
void ctypeFix()
{
	static unsigned short ctype2[0xFF];
 
	memcpy(ctype2,_pctype,0xFF*sizeof(unsigned short));
 
	ctype2[0xB0] |= 0x110;
	ctype2[0xDE] |= 0x110;
	ctype2[0xDF] |= 0x110;
 
	_pctype = ctype2;
 
	printf("ctypeFix\n");
}
 
void PrintCodeTable(void)
{
	int nHigh;
	int nLow;
	int nChar = 0;
 
	printf("   0 1 2 3 4 5 6 7 8 9 A B C D E F\n");
	for (nHigh = 0; nHigh < 16; nHigh++) {
		printf("%X_", nHigh);
		for (nLow = 0; nLow < 16; nLow++) {
			printf(" %c", isprint(nChar++) ? 'o' : '.');
		}
		printf("\n");
	}
}
 
int main()
{
	OSVERSIONINFOEX vi;
	char *psz;
 
	vi.dwOSVersionInfoSize = sizeof vi;
	GetVersionEx((LPOSVERSIONINFO)&vi);
	printf("Win%u.%u Build %u SP%u.%u\n", vi.dwMajorVersion, vi.dwMinorVersion,
		vi.dwBuildNumber, vi.wServicePackMajor, vi.wServicePackMinor);
 
	psz = setlocale(LC_ALL, "Japanese");
	printf("\n[%s]\n", psz);
	ctypeFix(); // setlocale 関数の呼び出しの後に追加します。
	PrintCodeTable();
 
	return 0;
}
 

実行(WinXP Home)
Win5.1 Build 2600 SP3.0

[Japanese_Japan.932]
ctypeFix
   0 1 2 3 4 5 6 7 8 9 A B C D E F
0_ . . . . . . . . . o . . . . . .
1_ . . . . . . . . . . . . . . . .
2_ o o o o o o o o o o o o o o o o
3_ o o o o o o o o o o o o o o o o
4_ o o o o o o o o o o o o o o o o
5_ o o o o o o o o o o o o o o o o
6_ o o o o o o o o o o o o o o o o
7_ o o o o o o o o o o o o o o o .
8_ . . . . . . . . . . . . . . . .
9_ . . . . . . . . . . . . . . . .
A_ . o o o o o o o o o o o o o o o
B_ . o o o o o o o o o o o o o o o
C_ o o o o o o o o o o o o o o o o
D_ o o o o o o o o o o o o o o . .
E_ . . . . . . . . . . . . . . . .
F_ . . . . . . . . . . . . . . . .
最終更新:2012年10月09日 22:55