主要目的是识别姓名汉字以外的所有字符

解决方案 »

  1.   

    我想也好判断。
    你参阅一下这个:http://ff.163.com/newflyff/gbk-list/
    看看你要判断的字符所在的区域。
      

  2.   

       //GBK汉字内码范围(不包括A1xx~A9xx的标点符号英文字母特殊符号等)
       //区码  ,位码
       //81-A0 ,40-7E 80-FE
       //AA-AF ,40-7E 80-A0
       //B0-D6 ,40-7E 80-FE
       //D7    ,40-7E 80-F9
       //D8-F7 ,40-7E 80-FE
       //F8-FE ,40-7E 80-A0
    #include <windows.h>
    #include <stdio.h>int main() {
        const DWORD uWidth = 18 + 17 * 256, uHeight = 18 + 17 * 128;    PBITMAPINFO pbmi = (PBITMAPINFO) LocalAlloc (LPTR, sizeof (BITMAPINFOHEADER) + sizeof (RGBQUAD) * 2);
        pbmi->bmiHeader.biSize = sizeof (BITMAPINFOHEADER);
        pbmi->bmiHeader.biWidth = uWidth;
        pbmi->bmiHeader.biHeight = uHeight;
        pbmi->bmiHeader.biPlanes = 1;
        pbmi->bmiHeader.biBitCount = 1;
        pbmi->bmiHeader.biSizeImage = ((uWidth + 31) & ~31) / 8 * uHeight;
        pbmi->bmiColors[0].rgbBlue = 0;
        pbmi->bmiColors[0].rgbGreen = 0;
        pbmi->bmiColors[0].rgbRed = 0;
        pbmi->bmiColors[1].rgbBlue = 255;
        pbmi->bmiColors[1].rgbGreen = 255;
        pbmi->bmiColors[1].rgbRed = 255;    HDC hDC = CreateCompatibleDC (0);
        void * pvBits;
        HBITMAP hBitmap = CreateDIBSection (hDC, pbmi, 0, &pvBits, NULL, 0);
        SelectObject (hDC, hBitmap);
        HFONT hFont = CreateFont (16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "宋体");
        SelectObject (hDC, hFont);
        BitBlt (hDC, 0, 0, uWidth, uHeight, NULL, 0, 0, WHITENESS);    char c[4];
        int i, j;
        for (i = 128; i < 256; i++) {
            sprintf (c, "%02X", i);
            TextOut (hDC, 1, (i - 127) * 17 + 1, c, 2);
        }
        for (j = 0; j < 256; j++) {
            sprintf (c, "%02X", j);
            TextOut (hDC, (j + 1)* 17 + 1, 1, c, 2);
        }
        for (i = 128; i < 256; i++) {
            for (j = 0; j < 256; j++) {
                c[0] = (char) i;
                c[1] = (char) j;
                TextOut (hDC, (j + 1) * 17 + 1, (i - 127) * 17 + 1, c, 2);
            }
        }
        for (i = 0; i < 130; i++) {
            MoveToEx (hDC, 0, i * 17, NULL);
            LineTo (hDC, uWidth, i * 17);
        }
        for (j = 0; j < 258; j++) {
            MoveToEx (hDC, j * 17, 0, NULL);
            LineTo (hDC, j * 17, uHeight);
        }    BITMAPFILEHEADER bmfh;
        bmfh.bfType = *(PWORD) "BM";
        bmfh.bfReserved1 = 0;
        bmfh.bfReserved2 = 0;
        bmfh.bfOffBits = sizeof (BITMAPFILEHEADER) + sizeof (BITMAPINFOHEADER) + sizeof (RGBQUAD) * 2;
        bmfh.bfSize = bmfh.bfOffBits + pbmi->bmiHeader.biSizeImage;    HANDLE hFile = CreateFile ("goal.bmp", GENERIC_WRITE, 0, 0, CREATE_ALWAYS, 0, 0);
        if (hFile != INVALID_HANDLE_VALUE) {
            DWORD dwWritten;
            WriteFile (hFile, &bmfh, sizeof (BITMAPFILEHEADER), &dwWritten, NULL);
            WriteFile (hFile, pbmi, sizeof (BITMAPINFOHEADER) + sizeof (RGBQUAD) * 2, &dwWritten, NULL);
            WriteFile (hFile, pvBits, pbmi->bmiHeader.biSizeImage, &dwWritten, NULL);        CloseHandle (hFile);
        }    DeleteObject (hFont);
        DeleteObject (hBitmap);
        DeleteDC (hDC);
        LocalFree (pbmi);    return 0;
    }看一下上面程序生成的goal.bmp文件。