Delphi 中String、ANSIString、TBytes之間的轉換

這個問題要從最近一個項目談起,服務器端要求UTF8編碼,Delphi內部是UTF16編碼,爲了避免風險我將代碼中數據都定義爲AnsiString,但實際還是除了些問題。

delphi7下

buffer是tbytes型,temp是string型

temp := string(pointer(buffer));
setlength(temp,length(buffer));
CopyMemory(Pointer(temp), @buffer[0], Length(buffer));
到了XE後,也許經過dot Net洗禮後,下面的代碼更好理解,當然這是站在開發者的角度。
var
  Buf : TBytes;
  S : String;
begin
  //AnsiChar內存數組->UnicodeString
  SetLength(Buf , 2);
  Buf[0] := 65;    //A的Ansii碼
  Buf[1] := 66;    //B~~
  S := TEncoding.ANSI.GetString(Buf);  //AnsiChar內存數組->UnicodeString
  ShowMessage(S);
 
  //UnicodeString -> AnsiChar內存數組
  SetLength(Buf , 0); //這句是測試時使用,實際使用時,不需要先清除
  Buf := TEncoding.Unicode.GetBytes(S); //UnicodeString -> AnsiChar內存數組
  ShowMessage(IntToStr(Buf[0]));
end;

所謂聰明的人用Pascal,Delphi 站在使用者角度可以這麼寫

uses SysUtils;

一、string轉爲ansistring
1、直接賦值 (有警告)
2、ansistring()類型強制轉換。(無警告)

二、ansistring 轉爲string

1、直接賦值 (有警告)
2、string()類型強制轉換。(無警告)

三、string 轉爲Tbytes

1、bytes:= bytesof(str) 已轉爲ansi編碼
2、bytes:= widebytesof(str) UNICODE 編碼

四、ansistring 轉爲Tbytes

1、bytes:= bytesof(str) ansi編碼
2、bytes:= widebytesof(string(str)) UNICODE 編碼

五、Tbytes 轉爲string

1、 str:=stringof(bytes) Tbytes 爲ansi編碼
2、 str:=widestringof(bytes) Tbytes 爲unicode編碼

六、PChar轉String

用StrPas函數,StrPas(PChar):AnsiString;


當然這內部大部分還是還是如下之類!

Result := TEncoding.UTF8.GetString(TEncoding.UTF8.GetBytes(sTemp));

這裏不得不說說,lazarus/FPC,UTF8作爲默認編碼,而且強制幾次就OK方便很多。

————————————————

部分內容引用
原文鏈接:https://blog.csdn.net/u011706768/article/details/119566174「暗夜魔尊」
原文鏈接:https://blog.csdn.net/zxm8513/article/details/104728514 「zxm8513」

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章