這個問題要從最近一個項目談起,服務器端要求UTF8編碼,Delphi內部是UTF16編碼,爲了避免風險我將代碼中數據都定義爲AnsiString,但實際還是除了些問題。
delphi7下
buffer是tbytes型,temp是string型
temp := string(pointer(buffer)); setlength(temp,length(buffer)); CopyMemory(Pointer(temp), @buffer[0], Length(buffer));
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」