DOS:如何在Turbo C中获取当前的国家代码或代码页

时间:2016-08-18 13:32:59

标签: locale dos

如何获取可以检测到国家/地区的某些特定于语言环境的信息?例如。 Turbo C中 DOS 环境中的当前国家/地区代码,键盘布局或代码页?

如果使用Turbo C库函数无法实现,某些BIOS调用可以这样做(INT 21)?。

KEYB程序能够显示例如键盘布局。这对我的目的来说已经足够了: https://www.dosbox.com/wiki/KEYB

1 个答案:

答案 0 :(得分:3)

使用INT 21h, AX=6501h。这是Turbo 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;
}

顺便说一下。 Ralf Brown的中断列表是DOS系统调用的绝佳资源。太糟糕了,即使在DOS用完之前它就不再被维护了,所以那里没有描述一些“最新”的东西。