我有一个文本文件,可以有不同的编码(ASCII,UTF-8,UTF-16,UTF-32)。最好的部分是它只用数字填充,例如:
192848292732
我的问题是:如下所示的功能是否能够正确显示所有数据?如果不是为什么? (我已将文件作为字符串加载到容器字符串中)
function output(container: AnsiString): AnsiString;
var
i: Integer;
begin
Result := '';
for i := 1 to Length(container) do
if (Ord(container[i]) <> 0) then
Result := Result + container[i];
end;
我的逻辑是,如果编码不同,那么ASCII和UTF-8额外字符都是0?
它完全通过了所有测试。
答案 0 :(得分:3)
ASCII字符集使用代码0-127。在Unicode中,这些字符映射到具有相同数值的代码点。所以问题归结为每个编码如何代表代码点0-127。
您提出的算法将无法检测ASCII码0(NUL)。但是你声明该文件中没有该字符。
我可以在您提出的代码中看到的唯一其他问题是它无法识别字节顺序标记(BOM)。这些可能出现在文件的开头,我想你应该检测它们并跳过它们。
说完这一切后,你的实施对我来说似乎很奇怪。您似乎声明该文件只包含数字字符。在这种情况下,您的测试同样可能是:
if container[i] in ['0'..'9'] then
.........
如果您使用此代码,那么您也可能会跳过BOM,如果它存在。