当前位置: 首页 > 知识库问答 >
问题:

SimpleXML和法文字符

林鸿飞
2023-03-14

我在一家国际公司工作,因此我们有很多语言需要适应。我对一些特殊的角色有问题。

我创建了一个独立的测试php页面,以消除系统可能引入的任何其他问题。

从我通读的各个页面中,我发现SimpleXML以UTF-8的形式处理XML。例如:返回的PHP SimpleXML值使用奇怪的字符代替连字符和撇号

所以我在页面的顶部这样做:

header("Content-type:text/html; charset=UTF-8");

然后我这样做是为了检查:

print mb_internal_encoding();

不确定这是否是正确的功能,但它在FF和Chome中为我提供了ISO-8859-1。

XML如下所示:

$xml = '<?xml version="1.0" encoding="ISO-8859-15"?>
<Tracking>
<File>
<FileNumber>çúé$`~  €   Š   š   Ž   ž   Œ   œ   Ÿ</FileNumber>
<OrigBranch>124</OrigBranch>
<Login></Login>
</File>
</Tracking>';

这打印出来都很有趣,但是对于我需要的页面,我不太明白它是如何在浏览器中打印出来的,因为实际的页面实际上是从cron将XML导入到MYSQL数据库中的,所以不太重要。不过它在FF上是这样显示的

print $xml;
���$`~ � � � � � � � � � 124

然后创建SimpleXML对象:

$parser = new SimpleXMLElement($xml);
print_r($parser);

这打印出来:

[File] => SimpleXMLElement Object
    (
        [FileNumber] => çúé$`~                           
        [OrigBranch] => 124
        [Login] => SimpleXMLElement Object
            (
            )

    )

我不太担心打印$xml;,中的有趣字符;,但是,还需要修复正在插入数据库的SimpleXMLElement对象中的字符。为什么SimpleXMLElement对象会丢失“~”之后的字符。我试图在头函数调用中将字符集更改为ISO-8859-15,但这只会导致print$xml;外观稍好,但“~”后仍缺少字符,但SimpleXMLElement给出了致命错误:

'String could not be parsed as XML

我在解析XML之前尝试过:

$xml = mb_convert_encoding($xml, "ISO-8859-15");
$xml = iconv('UTF-8', 'ISO-8859-15//TRANSLIT', $xml)

但这些也没有帮助。有什么建议吗?

共有3个答案

靳茂
2023-03-14

尝试$xml='

锺离宸
2023-03-14

如果您构建XML,请尝试对所有字符串进行Base64解码,然后在客户端读取XML并将其编码回来

拓拔高畅
2023-03-14

我在latin1中创建了一个特定的文件(ISO-8859-1),名为latin1.xml,内容如下(您可以在xml标签中添加编码="UTF-8",这是一样的):

<?xml version="1.0"?>
<Tracking>
<File>
<FileNumber>çùé$ °à §çòò àù§</FileNumber>
<OrigBranch>124</OrigBranch>
<Login></Login>
</File>
</Tracking>

然后我在php文件中加载内容,并从ISO-8859-1转换为UTF-8,然后用SimpleXMLElement进行解析。我之前附和了xml的内容

<?php
$xml = file_get_contents('latin1.xml');
echo '<pre>'.$xml.'</pre>'."<br>";
$xml2 = iconv("ISO-8859-1","UTF-8",$xml);
echo '<pre>'.$xml2.'</pre>'."<br>";
$parser = new SimpleXMLElement($xml2);
echo '<pre>'.print_r($parser).'</pre>'."<br>";

现在加载脚本,如果您的浏览器设置为UTF-8秒,第一个回声将不会很好地显示,但第二个回声和print_r($parser)都可以。否则,如果浏览器设置为ISO-8859-1,那么您将看到第一个回声良好,但不是第二个和print_r。

你可以根据自己的需要进行调整。

使现代化

ISO/IEC 8859-1缺少法语和芬兰语文本的一些字符,以及欧元符号。如果我能很好地理解您的评论,您可以将源文件(xml)放入ISO-8859-15,这样您就可以正确使用欧元符号。我创建了一个新文件,名为iso8859-15。xml,并将新的测试字符放在那里(也带有欧元符号)。在php文件中,我更改了第一条指令:

//$xml = file_get_contents('latin1.xml');
$xml = file_get_contents('iso8859-15.xml');

以及随后的转换:

$xml2 = iconv("ISO-8859-15","UTF-8",$xml);

现在加载脚本,如果您的浏览器设置为UTF-8秒,第一个回声将不会很好地显示,但第二个回声和SimpleXml的输出print_r($parser)都可以。

所以,现在您已经正确地解析了xml(在UTF-8中),您可以在写DB之前转换它(如果我正确理解的话,就是在ISO-8859-15编码中)。为了更清楚,您可以在最后将这一行添加到上面的php脚本中:

echo '<pre> File number in ISO-8859-15 for db: '.iconv("UTF-8","ISO-8859-15",$parser->File->FileNumber).'</pre>'."<br>";

如您所见,我从ISO-8859-15中的simpleXml转换了UTF-8数据,就像您在DB上编写时应该做的那样。那对我有用。

希望有帮助

 类似资料:
  • Simple 是一个 XML 序列化框架,一个Java版本宽容的序列化框架,能够快速在Java平台上开发XML。

  • 主要内容:PHP SimpleXML 简介,安装,PHP 5 SimpleXML 函数,PHP 5 SimpleXML 迭代函数PHP SimpleXML 简介 SimpleXML 扩展提供了一种获取 XML 元素的名称和文本的简单方式,只要您知道 XML 文档的布局。 SimpleXML 转换 XML 文档到 SimpleXMLElement 对象。 通过正常的属性选择器和数组迭代器,这个对象能够像其他对象一样被处理。 提示:与 DOM 或者 Expat 解析器比较,SimpleXML 只需要

  • 主要内容:什么是 PHP SimpleXML?,安装,PHP SimpleXML 实例,实例 1,实例 2,实例 3,更多 PHP SimpleXML 的信息PHP SimpleXML 处理最普通的 XML 任务,其余的任务则交由其它扩展处理。 什么是 PHP SimpleXML? SimpleXML 是 PHP 5 中的新特性。 SimpleXML 扩展提供了一种获取 XML 元素的名称和文本的简单方式。 与 DOM 或 Expat 解析器相比,SimpleXML 仅仅用几行代码就可以从 XM

  • 所以我得到了一个xml文件从肥皂服务(我无法控制)。它返回了一个xmlns,这导致了简单的XML问题。我正在运行一个str_replace来解决这个问题,但是现在simpleXML只返回一个空对象。XML结构看起来很好,没有错误,只是一个空对象。 返回:SimpleXMLElement对象() str replace之前的XML源是: 更换后: 任何帮助都将不胜感激,这快把我逼疯了! ----因此

  • 问题内容: 假设我有一些这样的XML 下面的代码实现了我想要的功能,它将标题输出为字符串 这是我的问题。下面的代码在该上下文中未将标题视为字符串,因此我最终在数组中使用了SimpleXML对象而不是字符串。 我一直在这样解决 但这看起来很丑。 无论上下文如何,将SimpleXML对象强制为字符串的最佳方法是什么? 问题答案: 将SimpleXMLObject类型转换为字符串: 上面的代码在内部调用

  • 问题内容: 我有以下XML: 并且正在尝试阅读office:document-meta节点以提取其下面的各种元素(dc:creator,meta:creation-date等)。 如下代码: 给我: 但是如果我尝试使用以下方法读取document-meta元素: 我懂了 我假设SimpleXML试图从$ officeXML中提取一个不存在的节点“文档”,然后减去(不存在的)常量“元”的值,导致强制