2014-02-10 53 views
2

我正在開發一個處理docx文件的XML內容並將其轉換爲特定格式的JAVA程序。它工作的很好,但是如果Word文件包含符號字符,例如我有問題希臘信件。在這種情況下,我只看到小方塊。從docx中提取符號字符

我檢查了源和看到這樣的事情:

<w:r w:rsidRPr="008E65F6"><w:rPr><w:rFonts w:ascii="Symbol" w:hAnsi="Symbol"/></w:rPr><w:t>ďˇ</w:t></w:r> 

或者,如果我將編碼設置爲UTF-8:

<w:r w:rsidRPr="008E65F6"><w:rPr><w:rFonts w:ascii="Symbol" w:hAnsi="Symbol"/></w:rPr><w:t></w:t></w:r> 

當我認爲作爲六,似乎希臘對於alpha,字符編碼爲EF 81 A1,對於beta等編碼爲EF 81 A2

我也試過val.getBytes(Charset.forName("utf8"))其中val是<w:t>標記的值。結果是例如[-17, -127, -95]。負面的價值對我來說是相當驚人的。

所以我的問題是,什麼是一個安全可靠的方法來將這些符號轉換爲普通的UTF-8字符?

+0

通常,在由Word發出的docx文件中,它已經是UTF-8;請參閱主文檔部分頂部的XML聲明(/word/document.xml)。你的與衆不同嗎? – JasonPlutext

+0

是的你是對的,它是UTF-8。但是,這些字符顯示不正確。大概符號字體不使用UTF-8字符編碼? – ttamas

回答

2

同時,我找到了解決方案,所以我將它添加爲將來參考的答案。

我用字形查看器軟件檢查了符號字體,並且我意識到它使用Unicode的專用區域作爲字符。像Times New Roman這樣的其他字體以正常的Unicode範圍存儲有關字符(例如希臘字母)。

因此,解決方案是將符號字形與標準Unicode字形進行映射。我已經爲符號字體中的希臘字母(大寫/小寫),標點符號,數字和數學符號手工創建了一個轉換表。請注意,即使variuos範圍內的字符的順序也彼此不同,例如,希臘字母在符號和Unicode中的排列順序不同。所以我必須逐個檢查字符代碼。

當我有轉換表時,我將它存儲在一個txt文件中。當我的應用程序在使用符號字體格式化的Word文件(示例中爲<w:rFonts>標記)中找到段(運行)時,它會調用轉換方法。在該方法中,我解析txt文件到HashMap,和從符號代碼由一個改變字符中的一個爲Unicode:

public String convert(String symbolString) { 
    StringBuilder sb = new StringBuilder(); 

    for(int k=0; k<symbolString.length(); k++){ 
     int origCode = Character.codePointAt(symbolString, k); 
     Integer replaceCode = conversionTable.get(origCode); 
     if(replaceCode != null) { 
      sb.append(Character.toChars(replaceCode)); 
     } else { 
      sb.append("?"); 
     } 
    } 

    return sb.toString(); 
} 

哪裏conversionTable是包含替換碼作爲十六進制值的HashMap對象。

+0

你能提供轉換表嗎? – TheJosh

+1

對不起,我剛纔看到你的提議,我希望現在還不遲。我將這些數據保存在一個txt文件中,並從代碼中解析出來。你可以從這裏下載我的txt文件:http://goo.gl/eWh9BX。請注意,它可能不完整,但涵蓋了希臘小寫字母,數字和最常見的數學符號。它包含一些以#開頭的匈牙利語言評論,你可以忽略它們。你是否也需要解析代碼? – ttamas