使用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
相关产品推荐
相关产品推荐

