簡體   English   中英

將Unicode轉換為ASCII

[英]Convert unicode to ascii

我有一個文本文件,可以使用不同的編碼(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?

它通過了所有測試。

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。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM