我正在將D2006程序轉換爲D2010。我的數據庫中每個字符的字符串都有一個字節的值,我需要將它加載到一個具有LoadFromStream的控件中,所以我的計劃是將該字符串寫入一個流,並將其用於LoadFromStream。但它沒有奏效。在研究這個問題時,我看到一個問題,告訴我我並不真正瞭解如何從AnsiString轉換爲Unicode字符串。下面是一段獨立代碼,它說明了我對以下內容感到困惑的問題:將AnsiString轉換爲Unicode字符串
procedure TForm1.Button1Click(Sender: TObject); {$O-}
var
sBuffer: String;
oStringStream: TStringStream;
sAnsiString: AnsiString;
sUnicodeString: String;
iSize1,
iSize2: Word;
begin
sAnsiString := '12345';
oStringStream := TStringStream.Create(sBuffer);
sUnicodeString := sAnsiString;
iSize1 := StringElementSize(sAnsiString);
iSize2 := StringElementSize(sUnicodeString);
oStringStream.WriteString(sUnicodeString);
end;
如果你打破的最後一行,並檢查oStringStream的字節屬性,你會看到,它看起來像這樣:
Bytes (49 {$31}, 50 {$32}, 51 {$33}, 52 {$34}, 53 {$35}
我期待它可能看起來像
(49 {$31}, 00 {$00}, 50 {$32}, 00 {$00}, 51 {$33}, 00 {$00},
52 {$34}, 00 {$00}, 53 {$35}, 00 {$00} ...
顯然我的期望是錯誤的。但是,那麼,如何將一個AnsiString轉換爲unicode?
我沒有從LoadFromStream中獲得正確的結果,因爲它一次從流中讀取兩個字節,但它所接收的數據不是以這種方式排列的。我應該怎麼做才能給LoadFromStream一個基於unicode字符串的格式良好的數據流?
謝謝你的幫助。
我不相信問題中有足夠的信息來啓用有意義的答案。涉及的變量是什麼類型?就編譯器生成的代碼中觸發的任何自動轉換而言,這將具有潛在的重要性。特別是oPayGrid的類型是什麼?此對象上存在sStream屬性表明它不是標準的VCL流。理想情況下,我希望將問題中的代碼示例重新構建爲一個獨立的工作示例,用於演示不需要進一步解釋/占卜的行爲。 – Deltics 2010-04-01 01:24:00
給Aotearoa冰雹! 對不起。我試圖避免用無益的細節來解決問題。我想我太成功了。 oPaygrid是一個類(TObject)。 oPaygrid.sStream是一個名字很差的AnsiString。 sUnicodeString是一個Delphi字符串,默認情況下它是一個unicode字符串。 iSize1和iSize2是整數。 我的問題主要是概念。當AnsiString被強制轉換爲unicode字符串時,我應該期望在unicode字符串中每個字符看到兩個字節嗎?我沒有看到這一點,它似乎是阻止我用LoadFromStream成功加載控件。 – jrodenhi 2010-04-01 01:41:48
您不應該使用StringElementSize()。只有在您的代碼是從半遷移的C++ Builder模塊中調用時纔是必需的。賦值'sUnicodeString:= sAnsiString'將字符串的有效載荷更正爲Char = WideChar,因此對StringElementSize的調用將始終爲您的UnicodeString返回SizeOf(AnsiChar)和SizeOf(Char)。 SizeOf(AnsiChar)/ SizeOf(Char)也快很多,閱讀和理解起來更容易,寫起來也更簡短。 – 2010-04-01 05:30:12