某些带有重音字符和点的链接无法在 Chrome、资源管理器和 Edge 上打开



我正在处理一个我从未见过的工作问题。当我开发时,我总是使用Firefox并通过JAVA上的XSL生成HTML,我测试了Firefox和所有工作的链接,即使它们在URL末尾有或没有重音字符或点(https://......一些单词**.**)当您单击链接时,它会将您带到页面底部,该链接的信息(https://...............#name 显示在单击的链接上

但是今天,我的老板打开了一个问题,告诉我在Chrome,Edge和资源管理器上,URL上带有重音字符或点的链接无法打开。所以我尝试点击一些链接,在 Chrome 上,有些有效,有些不起作用.....在资源管理器和边缘上不起作用。我是处理显示浏览器问题的新手。

因此,我检查了将XML模板转换为HTML的代码,并尝试添加以下两行:

transformer.setOutputProperty(OutputKeys.METHOD, "text/html");
transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");

(有了这两行,浏览器显示的是?而不是重音字符,我不知道为什么)

此外,在 XML 模板上,我添加了:

<xsl:template match="/">
<html>
<head>
<meta charset="UTF-8"></meta>
<meta http-equiv="content-type" content="text/html; charset=UTF-8"> </meta>
<meta name="viewport" content="width=device-width, initial-scale=1.0"> </meta>
</head>
...... more template code ......

但结果是一样的。在Firefox上所有链接都可以工作,在Chrome上有些是和有些否,在资源管理器和Edge上没有一个。

为什么它可以在火狐上工作,而在其他所有产品上都行不行?

问候。

-------------更新-------------

该文件由桌面应用程序生成,并创建一个 html 文件,该文件在进程结束时由系统的默认浏览器打开。

我认为问题不是在 UTF-8 上编码,但我已将 encondig 更改为原始 (ISO-8859-1),因为结果是相同的。

代码为:

public URL createHTML(ReportValidationTO validationTO) throws IOException, SAXException, IntrospectionException {
try {
PATH_XML = File.createTempFile("validacion", ".xml").getAbsolutePath();
String path_xsl = ConfigurationParametersManager.getParameter(PATH_XSL);
BeanReader reader = new BeanReader();
reader.registerBeanClass("validation", ReportValidationTO.class);
BeanWriter bWriter = initHTML();
AttributeDescriptor a1 = new AttributeDescriptor("validationName");
ElementDescriptor e1 = new ElementDescriptor();
e1.addAttributeDescriptor(a1);
XMLBeanInfo xmlInfo = new XMLBeanInfo(ReportValidationTO.class);
xmlInfo.setElementDescriptor(e1);
bWriter.write("validationTO", validationTO);
bWriter.flush();
InputStream inputXSL = getClass().getResourceAsStream(path_xsl);
URL retorno = (URL) transformToHTML(PATH_XML, inputXSL);
return retorno;
} catch (Exception e) {
logger.info("No se pudo cargar el archivo ");
logger.info("El error fue : " + e.getClass().getName() + " " + e.getMessage());
return null;
}
}

private BeanWriter initHTML() throws IOException, MissingConfigurationParameterException {
FileWriter fWriter = new FileWriter(PATH_XML);
BeanWriter bWriter = new BeanWriter(fWriter);
bWriter.setIndent("t");
String path_xsl = ConfigurationParametersManager.getParameter(PATH_XSL);
URL url_xsl = getClass().getResource(path_xsl);
String encoding = "<?xml version=" + ""1.0"" + " encoding=" + ""ISO-8859-1"" + " standalone=" + ""yes"" + "?>";
String xslFile = "<?xml-stylesheet type=" + ""text/xsl"" + " href=" + """ + url_xsl + """ + "?>";
bWriter.writeXmlDeclaration(encoding);
bWriter.writeXmlDeclaration(xslFile);
return bWriter;
}

然后:

private URL transformToHTML(String sXMLData, InputStream inputXSL) {
try {
Source xmlSource = new StreamSource(new File(sXMLData));
Source xsltSource = new StreamSource(inputXSL);
StringWriter cadenaSalida = new StringWriter();
Result bufferResultado = new StreamResult(cadenaSalida);
TransformerFactory factoriaTrans = TransformerFactory.newInstance();
Transformer transformador = factoriaTrans.newTransformer(xsltSource);
transformador.setOutputProperty(OutputKeys.METHOD, "html");
transformador.setOutputProperty(OutputKeys.ENCODING, "ISO-8859-1");
transformador.transform(xmlSource, bufferResultado);
File salida = File.createTempFile("validacion", ".html");
FileOutputStream out = new FileOutputStream(salida);
byte[] bytesSalida = cadenaSalida.toString().getBytes();
out.write(bytesSalida);
out.close();
URL url = salida.toURI().toURL();
return url;
} catch (Exception e) {
logger.info("nERROR EN TRANSFORM HTML VALIDACIONES");
logger.error(LoggerHelper.getStackTrace(e));
return null;
}
}

------- 使用一些 HTML 代码-------进行更新

<a href="#Linked Example"><font face="Verdana" color="#003399"><b>Title Example</b></font></a>
<ul type="disc">
<li>
<a href="#Link 1: Frase con acentos, est%C3%A1 en ejecuci%C3%B3n"><font size="-1" face="Verdana">SERIALNUMER2: Frase con acentos, el estado est&aacute; en ejecuci&oacute;n</font></a><a><font size="-1" color="red" face="Verdana">
																[Fails:
																3
																]
															</font></a>
</li>
</ul>
<a name="Linked Example"></a><b><font size="+1" face="Verdana">After click on the second link from above, it should send you here</font></b>
<hr color="black" WIDTH="100%">
<br>
<a name="Link 1: Frase con acentos, el estado est%C3%A1 en ejecuci%C3%B3n"></a><b><font size="-1" face="Verdana">Validacion:</font></b><font size="-1" face="Verdana">SERIALNUMER2: Frase con acentos, el estado est&aacute; en ejecuci&oacute;n</font>
<br>
<b><font size="-1" face="Verdana">Solution:</font></b><font size="-1" face="Verdana">None</font>
<br>
<br>
<table WIDTH="100%" BORDER="1">
<caption>
<font size="+1" face="Verdana" color="red">Error list</font>
</caption>
<tr>
<th align="LEFT" bgcolor="dddddd"><b>column1</b></th><th align="LEFT" bgcolor="dddddd"><b>column2</b></th><th align="LEFT" bgcolor="dddddd"><b>column3</b></th><th align="LEFT" bgcolor="dddddd"><b>column4</b></th><th align="LEFT" bgcolor="dddddd"><b>column5</b></th><th align="LEFT" bgcolor="dddddd"><b>column6</b></th><th align="LEFT" bgcolor="dddddd"><b>column7</b></th>
</tr>
<tr>
<td align="LEFT">2000</td><td align="LEFT">15</td><td align="LEFT">019</td><td align="LEFT">001</td><td align="LEFT">1087</td><td align="LEFT">0</td><td align="LEFT">B</td>
</tr>
<tr>
<td align="LEFT">2000</td><td align="LEFT">15</td><td align="LEFT">019</td><td align="LEFT">001</td><td align="LEFT">1113</td><td align="LEFT">0</td><td align="LEFT">B</td>
</tr>
<tr>
<td align="LEFT">2000</td><td align="LEFT">15</td><td align="LEFT">069</td><td align="LEFT">001</td><td align="LEFT">125</td><td align="LEFT">0</td><td align="LEFT">B</td>
</tr>
</table>
<br>
<b><font size="-1" color="#FF0000" face="Verdana">
											Total:
											3
											fail(s)
										</font></b>
<br>
<b><font size="-1" face="Verdana">
											The end
											:
										</font></b><b><font color="red" size="-1" face="Verdana">Problems found</font></b>

在代码段上,这里:

href="#Link 1: Frase con acentos, est%C3%A1 en ejecuci%C3%B3n"

在这里:

name="Link 1: Frase con acentos, el estado est%C3%A1 en ejecuci%C3%B3n"

为了使它在 Edge 上工作,如果您想重定向到页面上链接详细信息的位置,我需要将 %C3%A1替换为a,将 %C3%B3替换为o

那么,用JavaTransformer写出一个HTML文件的目的是什么呢?用哪种编码?如果你想写出一个文件,为什么你在两者之间使用StringWriter?考虑在 XSLT 中声明,例如<xsl:output method="html" encoding="UTF-8"/>你想要哪种输出方法和编码,那么,使用你的转换器写入名为validacion.html只需创建一个new StreamResult("validacion.html")(https://docs.oracle.com/javase/8/docs/api/javax/xml/transform/stream/StreamResult.html#StreamResult-java.lang.String-)并将其传递给transform方法。并且不要将任何编码信息(如字面上的<meta http-equiv="content-type" content="text/html; charset=UTF-8">放入XSLT创建的HTML中,只要您让它使用正确使用StreamResult即可,Transformer将根据xsl:output指令完成其工作。尝试创建临时 StringWriter 结果并将字符串转换为字节以将它们写出到 FileOutputStream 是不必要的,这可能会导致编码/解码不一致。

<font> 

已折旧。请改用 css 字体系列。Web 浏览器有一个默认字体系列,如果操作系统上未安装任何 css 字体系列,它们将回退到该字体系列。 IE 具有"忽略网页上指定的字体样式"的辅助功能设置。 维基百科使用此样式规则。

.uc {
font-family: Code2000, "TITUS Cyberbit Basic", "Doulos SIL",
"Chrysanthi Unicode", "Bitstream Cyberbit",
"Bitstream CyberBase", Thryomanes, Gentium, GentiumAlt,
"Lucida Grande", "Arial Unicode MS", "Microsoft Sans Serif",
"Lucida Sans Unicode";
font-family /**/:inherit; /* resets fonts for everyone but IE6 */
}

将 UC 类添加到正文标记。

要调试网页输出,请使用开发工具的 DOM 资源管理器来检查应用于元素或元素的文本内容的 css 规则。

好的,我终于得到了链接工作。感谢Rob ParsonsMartin Honnen

这两个问题:

  1. href的 URL 是用空格生成的(感谢马丁)

href="#Link 1: Frase con acentos, est%C3%A1 en ejecuci%C3%B3n" <- I removed the spaces on the XSLT with translate(validationName, ' ','-')

  1. href链接的引用上,因为这些是遗留代码,有名称,但在 HTML5 中它已被弃用,所以现在你必须在这里使用"id":

我改变了:

**name**="Link 1: Frase con acentos, el estado est%C3%A1 en ejecuci%C3%B3n" (also removed spaces with translate(validationName, ' ','-'))

**id**="Link 1: Frase con acentos, el estado est%C3%A1 en ejecuci%C3%B3n" (also removed spaces with translate(validationName, ' ','-'))

相关内容

最新更新