3

我需要一些帮助来完成一项任务。我需要处理 ASCII 格式的纯文本文件,并返回每个代码存在多少个字符(有多少个 a,多少个 b,等等)。它现在几乎可以完美运行。

我现在遇到的问题是,如果文件上有扩展的 ASCII 字符,当我使用 3fh 服务中断时,它不能很好地读取它们。

例如,如果文件有一个 é(ascii 代码 130),它会读取一个 ß(ascii 代码 225)。恐怕我用错了中断,但我不知道该怎么做,所以在这里提供一点帮助将不胜感激。调试也无济于事,因为中断执行得很好,没有错误,它只是返回缓冲区中的错误值。

这是我用来读取文件的确切代码。我有上一个中断的句柄。

      xor ax,ax
      lea dx, buffer        
      mov ah,3fh            
      mov bx,handle         
      mov cx,4096           
      int 21h               

谢谢!

编辑

我发现了问题,但不知道如何解决。原来,读作 225 的字符不是 é,而是 á。根据我发现的每个 ASCII 表,á 的代码应该是 160……但在 Unicode 中是 225……这很奇怪,因为我特意告诉记事本将其保存为 ANSI,而不是 ASCII……

4

1 回答 1

4

您正在混淆代码页。

MS-DOS 使用代码页 437,其中 é 是代码 130。但 ANSI 模式下的记事本使用代码页 1252,其中 é 是代码 233。

ASCII 最多只能定义为 127,因此没有 130 或 160 的 ASCII 图表之类的东西。扩展的 ASCII 没有标准化,因此不同的人以不同的方式扩展它。特别是,MS-DOS 和 Windows 使用不同的代码页,它们实际上是不同的扩展 ASCII 表。

如果您要使用 MS-DOS 操作文件,请使用代码页 437。如果您要使用 Windows 操作文件,请使用代码页 1252。(或者更好,使用 Unicode。)

但是你不能让一个文件在 MS-DOS 和 Windows 中得到相同的解释,就像你不能写一本可以用英语和法语解释相同的书一样。

于 2012-09-08T14:08:31.177 回答