将unicode转换为ascii

时间:2013-09-26 17:55:00

标签: delphi unicode encoding ascii delphi-7

我有一个文本文件,可以有不同的编码(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?

它完全通过了所有测试。

1 个答案:

答案 0 :(得分:3)

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

  • UTF-8在包含代码点值的单个字节中对代码点0-127进行编码。换句话说,如果有效载荷是ASCII,则ASCII和UTF-8编码之间没有区别。
  • UTF-16以两个字节对代码点0-127进行编码,其中一个为0,另一个为ASCII码。
  • UTF-32以4个字节对代码点0-127进行编码,其中3个为0,其余字节为ASCII码。

您提出的算法将无法检测ASCII码0(NUL)。但是你声明该文件中没有该字符。

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

说完这一切后,你的实施对我来说似乎很奇怪。您似乎声明该文件只包含数字字符。在这种情况下,您的测试同样可能是:

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

如果您使用此代码,那么您也可能会跳过BOM,如果它存在。