2016-08-18 10 views
0

国を特定できるロケール固有の情報を取得するにはどうすればよいですか?例えば。現在の国コード、キーボードレイアウトまたはコードページは、にあります。環境ですか?DOS:現在の国コードまたはコードページを取得する方法

これはTurbo Cライブラリ関数では不可能な場合、BIOSコールによっては(INT 21)?を行うことができます。

KEYBプログラムは、たとえば次のように表示できます。キーボード・レイアウト。それは私の目的のために十分であるでしょう。 https://www.dosbox.com/wiki/KEYB

答えて

3

INT 21h, AX=6501hを使用してください。ターボCのコードは次のとおりです。

#include <dos.h> 
#include <stdio.h> 

struct country_info_buffer 
{ 
    unsigned char info_id; 
    unsigned short buffer_size; 
    unsigned short country_id; 
    unsigned short code_page; 
    struct COUNTRY country_info; 
}; 

int main() 
{ 
    /* Registers for INT21 call */ 
    union REGS regs; 
    struct SREGS sregs; 
    /* Output buffer */ 
    struct country_info_buffer info; 

    /* Get current value of segment registers */ 
    segread(&sregs); 

    /* Get extended country information/general internationalization info */ 
    regs.x.ax = 0x6501; 
    /* Global code page */ 
    regs.x.bx = 0xFFFF; 
    /* Current country */ 
    regs.x.dx = 0xFFFF; 
    /* Size of output buffer */ 
    regs.x.cx = sizeof(info); 
    /* Pointer to output buffer goes to ES:DI */ 
    sregs.es = FP_SEG(&info); 
    regs.x.di = FP_OFF(&info); 

    /* Call int21 */ 
    intdosx(&regs, &regs, &sregs); 

    if (regs.x.cflag) 
    { 
    printf("Call failed, ax=%d\n", regs.x.ax); 
    return 1; 
    } 
    printf("Country code: %d, Code page: %d\n", info.country_id, info.code_page); 
    return 0; 
} 

Btw Ralf BrownのInterrupt Listは、DOSシステムコールのための素晴らしいリソースです。 DOSが好意を失う前でさえ、それは維持されていませんでしたので、いくつかの「最新の」ものはここには記載されていません。

+0

優れた答えです。 Unfortunatelly DOSBoxは有用な国またはコードページの情報を提供していないようです。返された情報は1 + 437(米国の国とコードページ)でした。現在のキーボードレイアウトは国を検出する唯一の有用なソースかもしれません。 – digitalfootmark

関連する問題