我想開發一個十六進制轉儲視圖,並且在當前活動的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和字體宋體,人物$ 81 $ 8D,8F $,$ 90 $ 9D是看不見的。 GetACP
返回1252,所以我使用Windows-1252。根據Wikipedia,我發現的範圍未在Windows-1252中定義。如何檢查在當前活動代碼頁中是否定義了具有序號值j
的字符?
你將需要定義的字符集。馬上,你的代碼會犯下嚴重的弊端。 「Char」是一個兩字節的UTF-16字符。這不是你想要的。對於十六進制編輯器,您希望使用ASCII或可能是ANSI代碼頁之一。你需要在這方面做出一些決定。兩個字節的「Char」根本無濟於事。 –
我想要一個ANSI轉儲。我以爲'Char'是好的,因爲ANSI字符會自動映射到unicode。 'HexChar'將被'HexDump'函數調用,它將使用s:= s + HexChar(x)'在右邊構建可讀的列。 –
有很多ANSI代碼頁。你想要哪一個?並且爲什麼要以16位類型存儲8位數據。請注意,'Chr(j)'不會按照您的想法從ANSI轉換爲Unicode。它產生一個帶序數值「j」的UTF-16字符元素。 –