0

XML ファイルから PHP ファイルに特定の文字を読み取るときに問題が発生します。

「ä」、「ü」、「ö」などの文字を使用します。次のエラーが表示されます。

simplexml_load_string() [function.simplexml-load-string]: エンティティ: 96 行目: パーサー エラー: 入力が適切な UTF-8 ではありません。エンコーディングを示してください ! バイト: 0xFC 0x73 0x65 0x0C

4

2 に答える 2

0

取得した XML の文字列が正しくエンコードされていません。ただし、デフォルトのエンコーディングはUTF-8、取得した文字列が異なり、おそらくWindows-1252.

そのエラーを解消したい場合は、その文字列を(質問の情報が不足しているため)不明なエンコーディングからUTF-8に再エンコードする必要があります。

エンコーディングが不明な場合は壊れているため、最初に文字列のエンコーディングを調べて学習する必要があります。

次に、それを UTF-8 に変換するか、エンコーディングを XML 文字列に挿入することができます。これはXMLRecoder、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 エンコーディングと、利用可能な文字セット エンコーディングと名前をよりよく理解するには、以下を参照してください。

于 2013-09-19T13:56:03.497 に答える
0

PHP 5 以前のバージョンには、ネイティブ Unicode サポートがありません。Unicode のサポートが約束されている PHP 6 または 7 には、何年もかかる可能性があります。このギャップを埋めるために、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 .)。お気に入りのエディター (私はSublimeが好きです) で XML ファイルを手動で開き、ファイルを 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 を私たちが望んでいるほどには処理していないように見えます。また、単にコアに組み込まれていないだけです。

Portable UTF-8 - a Lightweight Library for Unicode Handling in PHPを確認することをお勧めします。

于 2013-09-19T13:10:42.577 に答える