You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用C# Microsoft.Office.Interop.Word将Word转XML时符号转换异常

解决Symbol字体符号转XML时变成"("的问题

问题根源

你遇到的是Symbol字体的编码特性导致的:Symbol是单字节符号字体,它的字符映射和标准ASCII/Unicode完全不同。当你用Winwordcontrol.document.application.selection.range.Text获取文本时,Word会把这些单字节字符直接转成对应的ASCII字符(比如Symbol里的某个符号刚好对应ASCII的"("),而不是实际显示的Unicode符号,所以连Unicode值都拿到的是"("的。

解决方法

1. 逐个字符处理,结合字体判断做编码映射

不要直接取整个Range的Text,而是遍历Range里的每个Character,判断字体是否为Symbol,再把单字节编码映射到对应的Unicode符号:

// 示例(C#)
Word.Range targetRange = winwordControl.Document.Application.Selection.Range;
StringBuilder result = new StringBuilder();

foreach (Word.Char character in targetRange.Characters)
{
    if (character.Font.Name.Equals("Symbol", StringComparison.OrdinalIgnoreCase))
    {
        // Symbol字体的单字节编码对应固定Unicode符号,比如ASCII 65→U+0391(Alpha)
        byte symbolCode = (byte)character.Text[0];
        // 这里用Symbol到Unicode的标准映射,可根据实际符号调整
        char unicodeSymbol = (char)(0x0390 + symbolCode);
        result.Append(unicodeSymbol);
    }
    else
    {
        result.Append(character.Text);
    }
}

// 用result.ToString()作为转换后的文本

注:Symbol到Unicode的映射有标准表,比如希腊字母、数学符号等,你可以根据实际用到的符号完善映射逻辑。

2. 直接读取Range的XML内容

Word的Range对象提供了XML属性,里面会包含符号的正确Unicode表示,不用自己做映射:

string rangeXml = winwordControl.Document.Application.Selection.Range.XML;
// 解析这个XML,提取<w:t>标签里的内容,就是正确的符号文本

比如Symbol字体的符号在XML里会是类似这样的结构:

<w:r>
  <w:rPr>
    <w:rFonts w:ascii="Symbol" w:hAnsi="Symbol" w:cs="Symbol"/>
  </w:rPr>
  <w:t>Γ</w:t>
</w:r>

直接提取<w:t>里的内容就是正确的Unicode符号,之后再整合到你的XML输出里即可。

内容的提问来源于stack exchange,提问作者HajiAliyev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 00:47:18