2014-02-10 49 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