-1

我有一个可以采用不同编码(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 吗?

它通过了所有测试就好了。

4

1 回答 1

3

ASCII 字符集使用代码 0-127。在 Unicode 中,这些字符映射到具有相同数值的代码点。所以问题归结为每种编码如何表示代码点 0-127。

  • UTF-8 将代码点 0-127 编码为包含代码点值的单个字节。换句话说,如果有效载荷是 ASCII,那么 ASCII 和 UTF-8 编码之间没有区别。
  • UTF-16 将代码点 0-127 编码为两个字节,一个是 0,另一个是 ASCII 码。
  • UTF-32 将代码点 0-127 编码为四个字节,其中三个为 0,其余字节为 ASCII 码。

您提出的算法将无法检测 ASCII 代码 0 (NUL)。但是您声明文件中不存在该字符。

我可以看到您提出的代码的唯一另一个问题是它无法识别字节顺序标记(BOM)。这些可能出现在文件的开头,我想您应该检测它们并跳过它们。

说了这么多,你的实现对我来说似乎很奇怪。您似乎声明该文件仅包含数字字符。在这种情况下,您的测试同样可以是:

if container[i] in ['0'..'9'] then
  .........

如果您使用此代码,那么您也会碰巧跳过一个 BOM,如果它存在的话。

于 2013-09-26T18:20:25.040 回答