2011-06-23 60 views
2

我有一個沒有BOM編碼的UTF-8編碼的xml文件。在十六進制編輯器它給:3c 3f 78 6d將沒有BOM xml文件的UTF-8轉換爲ISO 8859-1

我緩存我的XML文件,並在開始處添加BOM:

char* BufferEncoder = (char*)malloc(3); 
memset(BufferEncoder, 0, size); 
for(int i=0;i<3;i++) BufferEncoder[i] ^= 0xaa; 
BufferEncoder[0]=(char)0xef; 
BufferEncoder[1]=(char)0xbb; 
BufferEncoder[2]=(char)0xbf; 
// concatenate into a new Buffer containing old xml and the BOM 

我試圖再從UTF-8 BOM轉換爲ISO 8859-1使用這些代碼行數:

int size = WideCharToMultiByte(28591 /*ISO-8859-1*/, 0, pBuffer, -1, NULL, 0, NULL, 0); 
if (size>0) 
{ 
    char* pBuffer2 = (char*)malloc(size); 
    memset(pBuffer2, 0, sizeNew); 
    WideCharToMultiByte(28591, 0,pBuffer,-1, pBuffer2, size, NULL, 0); 
    // ......... 

此代碼尚未測試。你認爲這是最好的解決方案嗎?任何想法或建議是受歡迎的。先謝謝你。

+1

我討厭問這個問題,因爲答案是非常糟糕的:爲什麼你覺得你必須從UTF-8轉換文本?另外,如果WideCharToMultiByte做我認爲它所做的事情;你正在使用錯誤的功能。 UTF-8不是寬字符編碼;和ISO-8859-1不是多字節。 –

+0

謝謝你的回答。我的xml文件是由另一個工具(TLC Simulink)生成的,我無法控制它。如果沒有包含特殊字符的BOM,IXMLDocument的加載函數無法加載xml UTF-8 ..因此,我必須將它轉換爲帶有BOM的UTF-8,然後轉換爲ISO 8859-1,否則它將無法工作。什麼是正確的功能呢? :)4 – Jawhar

+0

如果是這樣的話; IXMLDocument被無法挽回地破壞。使用不同的XML處理工具。如果你沒有明確這一點,在沒有XML聲明的情況下處理XML文檔的正確方法是聲明編碼,並且不會產生其他提示,說明編碼可能是將其視爲沒有BOM的UTF-8。任何不同的工具都是做錯了,需要避免和羞辱;如果時間和敏感性允許的話,也許會被劃分和劃分。 –

回答

1

正如我在我的評論談到:我覺得這個思路就必須有幾個問題右後衛你,可以這麼說:

  1. 你爲什麼要擺在首位做這種轉換?

  2. 你確實知道WideCharToMultiByte()是做什麼的嗎?

我會毫不猶豫地承認,我自己並不完全清楚WideCharToMultiByte()究竟做了什麼;但我會繼續前進,並假設它將一串寬字符轉換爲多字節字符串。快速瀏覽一下文檔,就好像它將它寫入新緩衝區,並返回新字符串的長度。

這是一切都很好,很棒。問題是UTF-8是而不是其實是一個寬字符編碼;而ISO-8859-1是而不是的一種多字節編碼。 UTF-8 多字節編碼;但在這種情況下,這並不能真正幫助你。

我的建議;那麼,你是否閱讀了字符編碼;特別是關於UTF-8(多字節)和UTF-16(寬)之間的區別。

我還建議你找到一個不同的接口,無論你試圖做什麼,它實際上接受UTF-8字符串;因爲任何需要ISO-8859-1字符串的接口,特別是在處理XML時,都會讓我覺得它是瘋狂的遺產-Y,接近完全瘋了。

當然,如果你真的說明了你正在嘗試,總體來說,要實現;可以給出更具體的建議。

編輯:如果我正確理解您的難題,問題是您正在獲取可能包含ASCII範圍之外的字符(U + 0 ... U + 127)的正確格式化和編碼的XML文件。如果是這樣的問題,以任何方式,形狀或形式使用ISO-8859-1將設置你所有的頭痛在路​​上的母親:

編碼問題

如果文本文件可以包含某些字符在ASCII範圍之外,那麼它可以想像得到包含以外的任何字符。雖然UTF-8可以代表任何字符,但ISO-8859-1並非如此。

換句話說;你最好的情況下,如果你堅持接口,虐待編碼是不可逆轉的信息損失;最壞的情況是炸藥和燃燒。

我的觀點是:不要掩蓋破損的界面,永遠不要使用UTF-8。

+0

我的問題更簡單我認爲:如果編碼的UTF-8沒有BOM,則由Simulink生成的xml文件可能包含特殊字符,然後IXMLDocument無法加載它。 Simulink的新版本現在提出了一個使用ISO 8859-1生成的xml文件,該文件已正確加載。我現在的問題是如何加載我的舊XML文件(utf8沒有BOM),並通過將它們轉換爲iso 8859-1來加載它們。謝謝你的回答..我不是XML和編碼專家。 – Jawhar

+0

@Jawhar:重申:永遠不要使用UTF-8。我不能強調這一點。由於過去做出的一些糟糕的選擇是基於大腦錯誤(如存儲空間和數據傳輸成本)的假設,整個字符編碼問題是一團糟,但Unicode和UTF -8特別是在這個可怕的可怕的可怕糾紛中,一個閃亮的希望燈塔。問題在於您使用的界面已損壞,您需要了解如何識別和處理用於XML處理的正確界面和工具。 600。 –