2015-12-07 105 views
0

當我在此字符串上使用UTF8ToAnsi時,結果爲空。任何想法爲什麼這可能是? msgstr「2. Broughton,PMG。^ iJournal of Automatic Chemistry。^ n^lVol 6. No 2.(1984年4月 - 6月)第94-95頁。Delphi UTF8ToAnsi失敗

這證明了此問題:

procedure TForm1.FormShow(Sender: TObject); 
begin 
Memo1.Lines.Text := 
    '<<' + 
    UTF8ToANSI('msgid "2. Broughton, PMG. ^iJournal of Automatic Chemistry.^n^lVol 6. No 2. (April – June 1984) pp 94-95."') + 
    '>>'; 
end; 

產生

「< < >>」

回答

2

您的代碼失敗,因爲您傳遞的內容不是UTF-8編碼。你傳遞這個函數實際上是ANSI編碼的。當Utf8Decode接收到該文本時,它會嘗試對其進行解碼,並在遇到格式錯誤的字節(非UTF-8字節)時,它會保留並返回空字符串。

問題字符是破折號1984年4月 - 6月這是一個n-dash。 ANSI編碼爲#150。當您嘗試將其解釋爲UTF-8時,該#150不是字符的單字節編碼,並且作爲多字節序列的第一個字節也是無效的。因此失敗。

爲了解決您的實際問題,您需要確定爲什麼在您期望使用UTF-8的地方有非UTF-8數據。

1

Utf8ToAnsi如果輸入是無效的UTF-8返回一個空字符串(如具有不完整的多字節字符或格式不正確的尾隨字節)。你可以調試你的程序來發現你的字符串真正包含的內容。您在獲取輸入字符串的方式上顯然存在問題。也許你誤解了UTF-8,或者你可能從未真正使用過UTF-8。

1

您在4月至6月之間使用的破折號不是有效的UTF8。所以它不能被正確解碼。這不是直接可見的,但您在此處使用的符號不是正常的減號,而是不同的字符。

+0

就是這樣。 Excel正在將「常規」字符轉換爲其他字符。謝謝你這麼敏銳的目光! – user3586403