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

从xml文件读取特定字符到php文件

丁晋
2023-03-14

当我将XML文件中的特定字符读取到PHP文件时,我遇到了一个问题。

我使用像“ä”、“ü”和“ö”这样的字符。我得到以下错误:

simplexml_load_string()[function.simplexml-load-String]:实体:第96行:解析器错误:输入不正确的UTF-8,指示编码!字节:0xFC 0x73 0x65 0x0C

共有2个答案

诸经略
2023-03-14

您得到的XML字符串没有正确编码。默认编码是UTF-8,但是您得到的字符串不同,很可能是Windows-1252

如果你想让这个错误消失,你需要将这个字符串(通过你问题中缺失的信息:)从未知编码重新编码为UTF-8。

由于未知的编码被破坏,您需要首先找出/了解字符串的编码。

然后,您可以将其转换为UTF-8,或者将编码插入XML字符串中,这很容易通过xmlrecord检查和修改基于XML声明和BOM的XML文档的字符编码。它的部分内容在PHP XMLReader中进行了解释,获得了关于XMLReader的版本和编码,但与SimpleXML一样,它也是一个基于libxml的PHP XML扩展,并共享了一些共同点,因此这是可行的。

用法示例:

$buffer = file_get_contents($file);

$fromEncoding = 'WINDOWS-1252';  # insert *your* correct string encoding here

$recoder = new XMLRecoder();
$buffer  = $recoder->setEncodingDeclaration($buffer, $fromEncoding);

$sxml = simplexml_load_string($buffer);

为了更好地理解PHP中的XML编码以及可用的字符集编码和名称,请参阅:

  • 如何获得php中iconv库支持的编码列表?(SimpleXML和其他PHP XML库在内部使用iconv库,将文档中的字符集转换为UTF-8的内存表示形式)
鲁向明
2023-03-14

PHP5和早期版本没有原生Unicode支持。promise支持Unicode的PHP6或PHP7可能需要几年时间。为了弥补这一差距,有几个扩展,如mbstring、iconv和intl。

确保发送带有适当内容类型和编码的HTML响应,例如。

<?php header('Content-Type: text/html; charset=utf-8');?>

还要检查XML文件序言是否包含正确的编码,例如。

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

假设这一切都是正确的,看起来xml文件声称是UTF-8,但实际上是别的东西(可能是latin1或ISO-8859-1或Mojibake。)。您可以在您最喜欢的编辑器中手动打开XML文件(我喜欢Sublime),并用UTF8编码显式保存文件。或者您可以使用一个函数在加载前尝试修改字符串。就像来自:错误:“输入不是正确的UTF-8,指示编码!”使用PHP的simplexml_load_string

function fix_latin1_mangled_with_utf8_maybe_hopefully_most_of_the_time($str)
{
    return preg_replace_callback('#[\\xA1-\\xFF](?![\\x80-\\xBF]{2,})#', 'utf8_encode_callback', $str);
}

function utf8_encode_callback($m)
{
    return utf8_encode($m[0]);
}

但是归根结底,它会很混乱,PHP似乎仍然没有像我们希望的那样处理Unicode,而且它根本没有内置到核心中。

我们建议您查看便携式UTF-8-一个用于PHP中Unicode处理的轻量级库。

 类似资料:
  • 问题内容: 我正在尝试使用php从文本文件中读取特定行。这是文本文件: 我如何使用php获取第二行的内容?这将返回第一行: ..但我需要第二个。 任何帮助将不胜感激 问题答案: 文件—将整个文件读入数组

  • 我在从xml文件中读取信息时遇到了一点问题... 传给我的文件有几千行。我只对300-400行感兴趣。当用户完成操作并且要读取的数据可以存储在中时,我不需要将任何数据写回xml。 我只对最内部名称元素的感兴趣(前两个是“098-0031”和“098-0032”)。 这是我的代码: 但是条件从来没有填满...谁能给我解释一下为什么。也许可以向我展示一种简单的方法来将这些值存储在中?提前感谢! 编辑:

  • 问题内容: 我正在尝试使用Java读取文件,并且该文件还包含特殊字符。我正在尝试将文件的内容写入另一个文件。 读取特殊字符文件的解决方案是什么? 问题答案: 您需要找出文件使用的确切编码,然后在参数中指定该编码。 尽管如此,通常最好通过将InputStream与InputStreamReader一起包装到Reader或BufferedReader中来读取字符数据 编辑注释: 使用Java的平台默认

  • 问题内容: 我不是在谈论特定的行号,因为我正在读取具有相同格式但长度不同的多个文件。 说我有这个文本文件: 我希望你知道我的意思。我正在考虑遍历文件,然后使用正则表达式搜索以找到“开始”和“结束”的行号,然后使用线缓存从开始行读取到结束行。但是如何获得行号?我可以使用什么功能? 问题答案: 如果您只想要和之间的文本块,则可以执行以下操作: 实际上,您不需要操纵行号即可读取开始和结束标记之间的数据。

  • 问题内容: 我对此有一个文件模拟:… 我想从存在“ HDK1001”字样的行开始阅读,并在世界“ HDK7564”字样处结束阅读 我尝试使用此代码,但无法执行限制 请帮帮我 问题答案: 试试这个代码。

  • 问题内容: 有什么方法可以从文本文件中读取特定行?在API或Apache Commons中。就像是 : 我同意实现起来很简单,但是特别是当文件很大时,效率不是很高。 问题答案: 可以,但是仍然存在效率问题。 或者,您可以使用: 由于有缓冲,这将稍微更有效。 看一下并尝试跳过整行(使用正则表达式)。我无法确定它是否会更有效- 对其进行基准测试。 PS 代表 效率, 我的意思是 记忆效率