Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php XML中的非法非标准引号_Php_Xml_Quotes - Fatal编程技术网

Php XML中的非法非标准引号

Php XML中的非法非标准引号,php,xml,quotes,Php,Xml,Quotes,我允许用户在我的网站上输入一些内容,这些内容稍后将以XML形式读取。每隔一段时间,我就会看到这些奇怪的单引号或双引号,比如“。这些是直接从破坏我的XML的源代码复制的。我想知道是否有一种简单的方法来纠正xml中的这些字符类型。他们似乎没有受到任何伤害 这些角色来自哪里?我甚至不知道我会如何在无意中把它们打印出来 编辑-我忘了澄清这些引号不是在属性中使用的,而是以以下方式使用的: <SomeTag>User’s Input</SomeTag> 用户输入 远离MicroSo

我允许用户在我的网站上输入一些内容,这些内容稍后将以XML形式读取。每隔一段时间,我就会看到这些奇怪的单引号或双引号,比如
。这些是直接从破坏我的XML的源代码复制的。我想知道是否有一种简单的方法来纠正xml中的这些字符类型。他们似乎没有受到任何伤害

这些角色来自哪里?我甚至不知道我会如何在无意中把它们打印出来

编辑-我忘了澄清这些引号不是在属性中使用的,而是以以下方式使用的:

<SomeTag>User’s Input</SomeTag>
用户输入

远离MicroSoft Office应用程序。Word、Excel等有一个坏习惯,就是用非标准的“智能引号”替换匹配的单引号对和双引号对

这些引号字符是真正的非标准字符,从来没有进入正式的拉丁-1字符集。所有MS Office应用程序都“有益地”用这些讨厌的字符替换标准引号字符


只需在谷歌上搜索“撤销smatquotes”或“将smartquotes转换回”以获取提示提示和正则表达式,就可以摆脱这些限制。

不要禁止和/或修改外来字符;这对你的用户来说太烦人了!这只是一个编码问题。我不知道您正在使用什么解析器来读取XML,但如果它相当复杂,您可以通过在XML文件顶部包含以下编码pragma来解决问题:

<?xml version="1.0" encoding="UTF-8"?>

解析器的API中还可能有一个UTF-8选项

编辑:我刚刚看到您正在浏览器中直接读取XML。大多数浏览器都听编码pragma


编辑2:显然,这些引用在UTF-8中甚至不合法,所以忽略我上面所说的。相反,您可能会找到您正在查找的内容,其中正在讨论类似的问题。

如果输入字符串是UTF-8编码的,可能需要将其指定给htmlentities(),例如:

$html = htmlentities( '”’', ENT_COMPAT, "utf-8" );
echo $html;
对我来说:

&rdquo;&rsquo;
鉴于

$html = htmlentities( '”’' );
echo $html;
感到困惑:

&acirc;??&acirc;??

如果输入字符串为非UTF-8,则需要相应地调整htmlentities()的编码参数。

这些引号是用于文本内容还是用于分隔属性?对于属性分隔符,XML需要打字机引号(单引号或双引号)。微软和其他文字处理应用程序经常试图变得聪明,用印刷引号取代打字机的引号,这几乎可以肯定是“它们从哪里来?”这个问题的答案

如果需要删除它们,使用文本编辑器进行简单的全局替换就可以了

但你可以先找出它们造成问题的原因。也许您的数据流无法处理任何非ASCII字符,在这种情况下,这是一个更深层次的问题,您确实应该解决(这通常意味着在这条线路的某个地方发生了一些不必要的转码)。

使用

 $s =    'User’s Input';
    $descriptfix = preg_replace('/[“”]/','\"',$s);
    $descriptfix = preg_replace('/[‘’]/','\'',$descriptfix);
echo    "<SomeTag>htmlentities($s)</SomeTag>";
$s='用户输入';
$descriptfix=preg\u replace(“/[”“]/”、“\”、$s);
$descriptfix=preg\u replace('/['']/','\'.$descriptfix);
回声“htmlentities($s)”;

难道不能用一个简单的字符串替换吗?这些“字符串”是如何断开的“您的XML?您如何输出它们?如果这些都是问题,那么任何非ASCII字符都可能是问题。好吧,基本上它在iphone和android上都无法解析。我只是担心会有更多的角色打破它。否则一个简单的替换就足够了。以什么方式“解析失败”?错误消息是什么?我猜您只是有一个编码问题,比如指定您的XML文件是用UTF-8编码的,但实际上您将这些字符作为拉丁1编码输出。这是您需要解决的一般编码问题,它不是特定于这些字符的。这些字符在将XML解析为Flash时也会导致问题,如果您没有记住嵌入所有的边缘大小写字符,它们不会出现在屏幕上:/所以这些字符就是从何而来的?正如Milosz所提到的,我不想修改用户的输入,但除了替换它们之外,我看不到很多选项。它们与标准的
“'
”有什么不同?当然它们是PUA,它们看起来不像是另一个上下文中的引用。这不是一个真正的答案,不是吗?这些智能引号是Unicode的一部分(U+201D和U+2019),否则它们甚至无法显示在本页上。作为普通的Unicode字符,它们可以很好地嵌入到XML文档中。是的,出于各种原因,您经常希望用常规引号替换智能引号,但没有技术上的理由因为它们而直接“避免使用MicroSoft Office”。这是“拉丁-1”八位编码,它是非标准的,也是导致许多崩溃的原因。为了再次说明问题,各种MS工具盲目地用哑引号代替智能引号。然而,XML标准规定某些属性值必须用哑引号括起来——使用奇特的引号字符括起来属性字符串是无效的XML。当然,绝对是这样。但我们甚至不知道问题是由XML属性中使用的这些引号引起的!听起来他更像是在用XML包装内容,这些引用是内容的一部分(应该可以正常工作),而不是XML的一部分。所以对我来说,这听起来更像是一个编码问题,最有可能的是嵌入在UTF-8编码文档中的Latin1。不幸的是,尽管我提出了要求,OP并没有具体说明。但如果您的编辑器将encoding=“UTF-8”更改为encoding=“UTF-8”,它们在UTF-8中是完全合法的。如果没有,我们就无法使用它们。可能是在
对于属性值定界是必需的-最初的问题在这方面并不清楚-但除此之外,我认为您在这里是正确的。它们是utf-8中的有效字符。但它们不是用于封装XML属性值的有效字符。因此,它们可以很高兴地作为元素或属性内容的一部分出现,但是,它们可以