我的某些印地语字符未在我的 CHtmlView 中正确显示 (xml.xsl)。为什么?

Some of my Hindi characters are not showing correctly in my CHtmlView (xml.xsl). Why?

MFC 对话 VS2015

我的应用程序使用 CHtmlView 浏览器。在这种情况下,它是一个隐藏的浏览器,纯粹用于触发 打印预览 机制。我刚刚开始添加对打印带有 印地语 内容的网页的支持。

当我的应用程序显示打印预览(通过 CHtmlView)时,有时文本显示不正确:

正在显示的内容是带有文字叠加的图像。简单的东西。字体为Arial Unicode MS。数据是 XML 使用 XSL 模板。

如果我直接在 Internet Explorer 11 中打开同一个文件:

如您所见,它正确显示了相同的文本。

如果我在 IE11 中右键单击,查看源代码,并将其复制到 Microsoft Expression Web 4:

再一次,一切看起来都不错。那么为什么 CHtmlView 打印预览不能正确显示呢?

如果您对发生这种情况的原因有任何想法,我想知道。我支持的其他 30 种语言(包括 阿拉伯语 不存在此问题)。

这是 HTML 的 head 部分。我确认 HTML 文件是 UTF-8 编码的:

<!DOCTYPE html PUBLIC "//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html lang="hi" xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <meta content="text/html; charset=utf-8" http-equiv="Content-Type">
    <title>
              Assignment Slips
            </title>
    <style type="text/css">
    body {
        font-family: 'Arial Unicode MS';
        font-size: 10pt;
    }
    .containerPage {
    }
    .containerSlip{
        float:left;
        position: relative; 
        margin: 3mm;
    }
    .fieldName {
        position: absolute;
        left: 45px; top: 48px; width: 265px;
    }
    .fieldAssisant {
        position: absolute;
        left: 63px; top: 85px; width: 246px;
    }
    .fieldDate {
        position: absolute;
        left: 56px; top: 124px; width: 254px;
    }
    .fieldCounsel {
        position: absolute;
        left: 76px; top: 158px; width: 230px;
    }
    .fieldOther {
        position: absolute;
        left: 77px; top: 291px; width: 155px;
        font-size: 8pt;
    }
    .checkBibleReading {
        position: absolute;
        left: 30px; top: 215px; width: 15px;
    }
    .checkInitialCall {
        position: absolute;
        left: 30px; top: 232px; width: 15px;
    }
    .checkReturnVisit {
        position: absolute;
        left: 30px; top: 248px; width: 15px;
    }
    .checkBibleStudy {
        position: absolute;
        left: 30px; top: 267px; width: 15px;
    }
    .checkOther {
        position: absolute;
        left: 30px; top: 285px; width: 15px;
    }
    .checkMainHall {
        position: absolute;
        left: 176px; top: 215px; width: 15px;
    }
    .checkAuxClass1 {
        position: absolute;
        left: 176px; top: 232px; width: 15px;
    }
    .checkAuxClass2 {
        position: absolute;
        left: 176px; top: 248px; width: 15px;
    }
    </style>
</head>

但请记住,隐藏的 CHtmlView(触发打印预览)的内容是 XML/XSL 转换的结果。

这是 XSL 模板:

<?xml version="1.0" encoding="utf-8"?>
  <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="html" indent="yes" version="4.01"
      doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
      doctype-public="//W3C//DTD XHTML 1.0 Transitional//EN"/>
    <xsl:template match="/">
      <html xmlns="http://www.w3.org/1999/xhtml">
        <xsl:attribute name="lang">
          <xsl:value-of select="//Settings//LanguageCode"/>
        </xsl:attribute>
        <head>
          <meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
          <link rel="stylesheet" type="text/css">
            <xsl:attribute name="href">
              <xsl:value-of select="//Settings/Template/@Style"/>
            </xsl:attribute>
          </link>
          <title>
            <!--<xsl:value-of select="//Labels/ReportTitleWorksheets"/>-->
            Assignment Slips
          </title>
          <style type="text/css">
            @import url('<xsl:value-of select="//Settings/Template/@Style"/>');
          </style>
        </head>
        <body>
          <xsl:for-each select="AssignmentSlips/Page">
            <div class="containerPage">
              <xsl:if test="@PageBreakBefore=1">
                <br style="page-break-before: always;"/>
              </xsl:if>
              <xsl:for-each select="StudentSlip">
                <div class="containerSlip">
                  <img alt="s89" width="323px" height="429px">
                    <xsl:attribute name="src">
                      <xsl:value-of select="//Settings/Template"/>
                    </xsl:attribute>
                  </img>
                  <div class="fieldName">
                    <xsl:attribute name="dir">
                      <xsl:value-of select="//Settings/Direction"/>
                    </xsl:attribute>
                    <xsl:value-of select="Student"/>
                  </div>
                  <div class="fieldAssisant">
                    <xsl:attribute name="dir">
                      <xsl:value-of select="//Settings/Direction"/>
                    </xsl:attribute>
                    <xsl:value-of select="Assistant"/>
                  </div>
                  <div class="fieldDate">
                    <xsl:attribute name="dir">
                      <xsl:value-of select="//Settings/Direction"/>
                    </xsl:attribute>
                    <xsl:value-of select="Date"/>
                  </div>
                  <div class="fieldCounsel">
                    <xsl:attribute name="dir">
                      <xsl:value-of select="//Settings/Direction"/>
                    </xsl:attribute>
                    <xsl:value-of select="StudyPoint"/>
                  </div>

                  <xsl:choose>
                    <xsl:when test="Assignment=1">
                      <div class="checkBibleReading">✓</div>
                    </xsl:when>
                    <xsl:when test="Assignment=2">
                      <div class="checkInitialCall">✓</div>
                    </xsl:when>
                    <xsl:when test="Assignment=3">
                      <div class="checkReturnVisit">✓</div>
                    </xsl:when>
                    <xsl:when test="Assignment=4">
                      <div class="checkBibleStudy">✓</div>
                    </xsl:when>
                    <xsl:when test="Assignment=5">
                      <div class="checkOther">✓</div>
                      <div class="fieldOther">
                        <xsl:attribute name="dir">
                          <xsl:value-of select="//Settings/Direction"/>
                        </xsl:attribute>
                        <xsl:value-of select="Other"/>
                      </div>
                    </xsl:when>
                  </xsl:choose>
                  <xsl:choose>
                    <xsl:when test="Location=1">
                      <div class="checkMainHall">✓</div>
                    </xsl:when>
                    <xsl:when test="Location=2">
                      <div class="checkAuxClass1">✓</div>
                    </xsl:when>
                    <xsl:when test="Location=3">
                      <div class="checkAuxClass2">✓</div>
                    </xsl:when>
                  </xsl:choose>
                </div>
              </xsl:for-each>
            </div>
          </xsl:for-each>
        </body>
      </html>
    </xsl:template>
</xsl:stylesheet>

但我确认我不断遇到某些字符在我的特定打印预览中未正确显示的偶发问题。

我不知道为什么,但是我的:

body
{
    font-family: "Arial Unicode MS";
    font-size: 10pt;
}

...顶级 CSS 格式未被接受。

我不得不将设置复制到我的每个 CSS 类:

<style type="text/css">
.containerPage {
    font-family: "Arial Unicode MS";
    font-size: 10pt;
}
.containerSlip{
    float:left;
    position: relative; 
    margin: 3mm;
}
.fieldName {
    position: absolute;
    left: 45px; top: 46px; width: 265px;
    font-family: "Arial Unicode MS";
}
.fieldAssisant {
    position: absolute;
    left: 63px; top: 81px; width: 246px;
    font-family: "Arial Unicode MS";
}
.fieldDate {
    position: absolute;
    left: 56px; top: 122px; width: 254px;
    font-family: "Arial Unicode MS";
}
.fieldCounsel {
    position: absolute;
    left: 76px;
    top: 156px;
    width: 230px;
    font-family: "Arial Unicode MS";
}
.fieldOther {
    position: absolute;
    left: 77px; top: 289px; width: 155px;
    font-size: 8pt;
    font-family: "Arial Unicode MS";
}
.checkBibleReading {
    position: absolute;
    left: 30px; top: 213px; width: 15px;
}
.checkInitialCall {
    position: absolute;
    left: 30px; top: 232px; width: 15px;
}
.checkReturnVisit {
    position: absolute;
    left: 30px; top: 248px; width: 15px;
}
.checkBibleStudy {
    position: absolute;
    left: 30px; top: 267px; width: 15px;
}
.checkOther {
    position: absolute;
    left: 30px; top: 285px; width: 15px;
}
.checkMainHall {
    position: absolute;
    left: 176px; top: 213px; width: 15px;
}
.checkAuxClass1 {
    position: absolute;
    left: 176px; top: 232px; width: 15px;
}
.checkAuxClass2 {
    position: absolute;
    left: 176px; top: 248px; width: 15px;
}
</style>

我想为这个问题提供一个新的答案。

我必须让 CHtmlView 使用 最新 安装的 Internet Explorer 浏览器。这可以通过直接在 <head> 标记之后插入此 meta 数据来实现,如下所示:

<meta http-equiv="X-UA-Compatible" content="IE=edge">

因此 <head> 元素可能如下所示:

<head>
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta content="text/html; charset=utf-8" http-equiv="Content-Type">
    <style type="text/css">
        /* Styles here */
    </style>
    <title>Document Title</title>
</head>

由于我的 HTML 文档是使用 XSL 转换创建的,因此我能够包含上述元数据。使用最新浏览器的唯一副作用是我的分页符不再有效。但是我能够更改我的 HTML 语法以使它们再次工作。

对 HTML 文件的简单代码更改将使其使用最新安装的浏览器。不再有字体损坏!