2009-09-25 54 views
1

我使用Unicode SynEdit,它(理論上)具有基本的文件/流編碼檢測。它工作正常,直到我試圖打開由我的PHP腳本生成的文件。我說的文件被UniSynEdit檢測爲utf8,沒有BOM。不幸的是,它沒有打開 - 加載的字符串是空的。我調試了它,而且問題似乎是Utf8Decode函數,它由於某種原因失敗並返回空字符串。我也用十六進制編輯器檢查了這個文件,它是真的:它沒有BOM,所有普通字符都使用一個字節進行編碼,而在文件中有一些波蘭字母(如「ł」)是雙字節。 ..Delphi,字符集檢測([Uni] SynEdit) - Utf8Decode問題

有什麼可能是錯的,我該如何防止這種情況?我相信加載錯誤的編碼總比沒有文件好...

+0

你在什麼版本的德爾福? – 2009-09-25 15:22:01

+0

我忘了寫... Delphi 7. – migajek 2009-09-25 15:59:24

+0

有BOM時會發生什麼? – 2009-09-25 16:28:40

回答

3

如果你真的想加載不正確的UTF-8編碼文件,那麼你需要使用一個函數,不返回一個空的結果一個包含無效字節序列的字符串,但會替換它們替換字符。請參閱Wikipedia entry on UTF-8,特別是有關「無效字節序列」的部分。

不幸的是德爾福2009年(沒有德爾福7檢查那裏)UTF8Decode()內部調用MultibyteToWideChar(CP_UTF8, ...),這將返回無效字節序列上的錯誤。

你需要做的是使用一種替代編碼功能。也許在第三方Delphi庫中有一些東西有自己的解碼功能。也許你可以使用其中一個鏈接庫here。如果一切都失敗了,你可以自己寫,也許根據Unicode聯盟的this code

+0

順便說一句:如果你甚至沒有意思*你的PHP腳本創建一個UTF-8文件 - 再想一想。它應該,並且最好是有效的UTF-8 :-) – mghie 2009-09-25 20:24:43

+0

這不是重點:)實際上,由於我發現我的應用程序在某些時候失敗了,所以我確信它處理了所有**有效的**文件。它確實如此。但我沒有機會再次測試那些無效;) – migajek 2009-09-25 23:30:38

+0

謝謝,似乎從cUnicodeCodecs(德爾福基礎)使用UTF8StringToWideString工作正常:] – migajek 2009-09-26 09:13:17