簡體   English   中英

在Delphi 7中獲取char值

[英]Getting char value in Delphi 7

我正在Delphi 7中創建一個程序,它應該將unicode字符串編碼為html實體字符串。 例如,“ ABCģķī ”將導致“ ABCģķī

現在2個基本的東西:

  1. Delphi 7是非Unicode的,所以我不能直接在代碼中編寫unicode字符來編碼它們。
  2. 代碼頁由255個條目組成,每個條目包含一個特定於該代碼頁的字符,除了前127個,對於所有代碼頁都是相同的。

那么 - 如何獲得char的值,即1-255范圍內?

我嘗試了Ord(Integer) ,但它也返回超過255的值。基本上,一切都很好(A返回65,依此類推),直到我的字符串達到非拉丁語unicode。

有沒有其他方法可以返回char值? 任何幫助贊賞

我建議你避免像瘟疫一樣的代碼頁。

我認為有兩種Unicode方法:WideString和UTF-8。

Widestrings的優勢在於它是Windows的“原生”,如果您需要使用Windows API調用,這將有所幫助。 缺點是存儲空間,它們(如UTF-8)可能需要多個WideChars來編碼完整的Unicode空間。

UTF-8通常是優選的 與WideStrings一樣,這是一個多字節編碼,因此特定的unicode“代碼點”可能需要字符串中的幾個字節來對其進行編碼。 如果您對字符串進行大量逐個字符處理,這只是一個問題。

@DavidHeffernan評論( 正確地 ),在某些情況下,WideStrings 可能更緊湊。 不過,我只推薦UTF-16只有當你絕對相信你的編碼文本真的會更加緊湊(不要忘記標記!),而這種緊湊對你非常重要的。

在HTML 4中,數字字符引用與HTML使用的字符集相關。 無論是通過<meta>標簽在HTML本身中指定該字符集,還是通過HTTP / MIME Content-Type標頭或其他方式在帶外指定,都無關緊要。 因此, "ABC&#291;&#311;&#299;" 只有當HTML使用UTF-16時才能准確表示"ABCģķī" 如果HTML使用的是UTF-8,那么正確的表示形式將是"ABC&#196;&#163;&#196;&#183;&#196;&#171;" "ABC&#xC4;&#xA3;&#xC4;&#xB7;&#xC4;&#xAB;" 代替。 大多數其他字符集不支持這些特定的Unicode字符。

在HTML 5中,數字字符引用包含原始Unicode代碼點值,與HTML使用的字符集無關。 因此, "ABCģķī"將表示為"ABC#291;&#311;&#299;" "ABC&#x0123;&#x0137;&#x012B;"

因此,要回答您的問題,您首先要做的是決定是否需要使用HTML 4或HTML 5語義進行數字字符引用。 然后,您需要將Unicode數據分配給WideString (這是Delphi 7本身支持的唯一Unicode字符串類型),它使用UTF-16,然后:

  1. 如果你需要HTML 4:

    A.如果HTML字符集不是UTF-16,則使用WideCharToMultiByte() (或等效的)將WideString轉換為該字符集,然后使用IntToStr()循環輸出未保留字符的結果值和保留值的字符引用IntToStr()表示十進制表示法, IntToHex()表示十六進制表示法。

    B.如果HTML字符集是UTF-16,然后通過簡單地每個環路WideCharWideString ,輸出未保留字符原樣和保留值,字符引用使用IntToStr()為十進制符號或IntToHex()為十六進制表示法。

  2. 如果您需要HTML 5:

    A.如果WideString不包含任何代理對,然后通過簡單地每個環路WideCharWideString ,輸出未保留字符原樣和保留值,字符引用使用IntToStr()為十進制符號或IntToHex()為十六進制表示法。

    B.否則,使用WideStringToUCS4String()WideString轉換為UTF-32,然后循環生成輸出非保留代碼點的結果值和保留代碼點的字符引用,使用IntToStr()表示十進制表示法或IntToHex()表示十六進制表示法。

如果我正確地理解了OP,我會把它留在這里。

function Entitties(const S: WideString): string;
var
  I: Integer;
begin
  Result := '';
  for I := 1 to Length(S) do
  begin
    if Word(S[I]) > Word(High(AnsiChar)) then
      Result := Result + '#' + IntToStr(Word(S[I])) + ';'
    else
      Result := Result + S[I];
  end;
end;

暫無
暫無

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

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