2013-09-26 200 views
-1

我有一个文本文件,可以用不同的编码(ASCII,UTF-8,UTF-16,UTF-32)来。最好的部分是,它是只用数字填写,例如:将unicode转换为ascii

192848292732

我的问题是:会像一个函数波纹管能够正确显示所有数据?如果不是为什么? (I已加载该文件作为一个串入容器字符串)

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?

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

+2

什么是字符串? AnsiString或UnicodeString?如何在不指定Delphi版本的情况下提出Unicode问题?你如何提出处理物料清单? –

+0

@DavidHeffernan我使用delphi 7,字符串是一个AnsiString女巫包含从文件加载的字节,0代表字节0我假设字节0是假的,我剥离它仍然是一个干净的ascii字符串。这是正确的吗 ? – opc0de

+0

@SertacAkyuz是的,我会编辑我的问题根据 – opc0de

回答

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查看是否存在。

+0

我明白谢谢你的帮助。 – opc0de

+2

@DavidHeffernan:该表达式不应该写在['0'..'9']“中的”容器[i]“? –

+0

@HeartWare感谢您的编辑 –