2013-09-26 235 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感謝您的編輯 –