我希望开发一个十六进制转储视图,但在当前活动的ANSI代码页(CP_ACP)中无法打印的字符会出现问题。如何检测它们并打印一个点代替?
我的函数目前看起来像这样:
function HexChar(j: byte): AnsiChar;
begin
if j < $20 then result := '.'
// Dirty workaround which only supports the undefined characters of Windows-1252
else if (GetACP=1252) and ((j=$81) or (j=$8D) or (j=$8F) or (j=$90) or (j=$9D)) then result := '.'
else result := AnsiChar(j);
end;
使用Delphi XE4和Courier New字体时,字符$81、$8D、$8F、$90、$9D是不可见的。GetACP返回1252,所以我正在使用Windows-1252。根据维基百科的ISO_8859-1词条,我发现的这个编码范围在Windows-1252中没有定义。我该如何检查具有序号值
j
的字符是否已在当前活动代码页中定义?
Char
是一个两个字节的 UTF-16 字符,这不是你想要的。对于十六进制编辑器,你需要使用 ASCII 或者其中一个 ANSI 代码页。你需要在这方面做出一些决策。两个字节的Char
毫无帮助。 - David HeffernanChr(j)
并不像你想象的那样从 ANSI 转换为 Unicode。它会产生一个具有序数值j
的 UTF-16 字符元素。 - David HeffernanAnsiChar(j)
。 - Daniel MarschallMemo1.Text := AnsiChar($88)
在我的电脑上会产生插入符号,当且仅当 memo 的字体设置为 Courier New 时。不如您给我们提供一个 SSCCE。 - David HeffernanSystem.Win.Crtl
导入的isprint
函数(或者该函数族中的其他函数),它们正是为此目的而设计的。如果你想要将空格也一并处理,可以使用isgraph
函数,该函数用于确定字符在呈现时是否可见。 - TLama