當您需要用 TMemoryStream 寫入一個文本文件的時候,最好在寫入任何字符數據進去之前先寫入一個 Byte Order Mark (BOM):
var
Bom: TBytes;
begin
...
Bom := TEncoding.UTF8.GetPreamble;
Write(Bom[0], Length(Bom));
而任何寫入的字符需要被轉換成 UTF-8 編碼:
var
Temp: Utf8String;
begin
...
Temp := Utf8Encode(Str); // Str 是要寫入文件的字符
Write(Pointer(Temp)^, Length(Temp));
//Write(Pointer(Str)^, Length(Str)); 原來寫入字符串的代碼
接上文
MultiByteToWideChar 函數
調用 Windows API MultiByteToWideChar 函數可以簡單的用一個任務替代,下面是一個是用 MultiByteToWideChar 的例子:
procedure TWideCharStrList.AddString(const S: string);
var
Size, D: Integer;
begin
Size := SizeOf(S);
D := (Size + 1) * SizeOf(WideChar);
FList[FUsed] := AllocMem(D);
MultiByteToWideChar(0, 0, PChar(S), Size, FList[FUsed], D);
Inc(FUsed);
end;
轉換到 Unicode 下可以寫作這樣(同時支持 Unicode 和 ANSI 字符):
procedure TWideCharStrList.AddString(const S: string);
{$IFNDEF UNICODE}
var
L, D: Integer;
{$ENDIF}
begin
{$IFDEF UNICODE}
FList[FUsed] := StrNew(PWideChar(S));
{$ELSE}
L := Length(S);
D := (L + 1) * SizeOf(WideChar);
FList[FUsed] := AllocMem(D);
MultiByteToWideChar(0, 0, PAnsiChar(S), L, FList[FUsed], D);
{$ENDIF}
Inc(FUsed);
end;
SysUtils.AppendStr 函數
AppendStr 函數已經廢棄了,因為它與 AnsiString 硬編碼在一起,而且沒有 Unicode 的版本可以替換,所以下面的代碼
AppendStr(String1, String2);
應該換成:
String1 := String1 + String2;
您也可以使用新的 TStringBuilder 類來替換。
使用 Named Threads
現有 Delphi 代碼中使用了 Named Threads 的代碼必須修改了。在早先的版本中,當你需要在分類(gallery)中用一個新的 Thread Object 去創建一個 Thread 的時候,需要在新的 Thread 單元中建立下面的類型:
type
TThreadNameInfo = record
FType: LongWord; // must be 0x1000
FName: PChar; // pointer to name (in user address space)
FThreadID: LongWord; // thread ID (-1 indicates caller thread)
FFlags: LongWord; // reserved for future use, must be zero
end;