2013-04-30 4 views
2

xml을 사용하는 데 문제가 있습니다. 나는이 질문이 comon 인 것을 안다. 그러나 내가 발견했던 대답은 나의 문제를 해결하지 않았다. 문제는 php domdocument를 사용하여 é 또는 ä 또는 다른 특수 문자를 xml 파일에 추가하면 é을 xE9로, ä를 xE4로 저장한다는 것입니다. 나는 이것이 괜찮은지 모르지만 출력을 보여주고 싶을 때이 장소에 물음표를 보여줍니다. 나는 많이 시도했다. PHP domdocument의 de xml 헤더에서 인코딩을 제거하고 추가하는 것과 같습니다. 나는 또한 file_get_contents를 사용하고 php utf-8_decode를 사용하여 XML을 얻으려고 시도했다. 나는 iso를 사용하여 시도했지만 아무 것도 내 문제를 해결하지 못했습니다. 대신 PHP xml 파싱 오류가 발생했습니다. 나는 틀린 일을해야한다. 그러나 무엇? 그게 내 질문과 어떻게이 문제를 해결할 수 있습니다. 내 xml 파일은 다음과 같습니다. xE9 및 xE4의 배경이 검은 색입니다. xml에서 PHP utf-8 디코드가 물음표를 반환합니다.

<?xml version="1.0" encoding="UTF-8"?> 
<root> 
    <row id="1"> 
    <question>blah</question> 
    <answer>blah</answer> 
    </row> 
    <row id="2"> 
    <question>xE9</question> 
    <answer>xE4</answer> 
    </row> 
</root> 

내 PHP의 XML 클래스 이것이 내가 spcial 문자를 추가 할 때까지

//creates new xml row and saves it in xml file 
function addNewRow($question, $answer) { 
    $nextAttr = $this->getNextRowId(); 
    $parentNode = $this->xmlDoc->documentElement; 
    $rowNode = $this->xmlDoc->createElement('row'); 
    $rowNode = $parentNode->appendChild($rowNode); 
    $rowNode->setAttribute('id', $nextAttr);  
    $q = $this->xmlDoc->createElement('question'); 
    $q = $rowNode->appendChild($q); 
    $qText = $this->xmlDoc->createTextNode($question); 
    $qText = $q->appendChild($qText); 
    $a = $this->xmlDoc->createElement('answer'); 
    $a = $rowNode->appendChild($a); 
    $aText = $this->xmlDoc->createTextNode($answer); 
    $aText = $a->appendChild($aText); 
    $this->xmlDoc->save($this->file); 
} 

모든 것이 잘 작동하는 새로 추가 행 함수에게 있습니다

function __construct($filePath) { 
    $this->file = $filePath; 
    $this->label = array('Vraag', 'Antwoord'); 
    $xmlStr = file_get_contents($filePath); 
    $xmlStr = utf8_decode($xmlStr); 
    $this->xmlDoc = new DOMDocument('1.0', 'UTF-8'); 
    $this->xmlDoc->preserveWhiteSpace = false; 
    $this->xmlDoc->formatOutput = true; 
    //$this->xmlDoc->load($filePath); 
    $this->xmlDoc->loadXML($xmlStr); 
}  

의 일부. 그것들은 questionmarks로 표시됩니다.

+0

당신은 특수 문자를 참조 아직 XML 샘플은이 없습니다 : W3C는 당신이 지금 읽고 시사 주제에 대한 몇 가지 유용한 자료를 수집하고있다. ** 그것이 xE9로, ä를 xFC **로 저장한다는 것은 무엇을 의미합니까? PHP 코드는 XML을 DOMDocument 객체로로드하는 것을 보여줍니다. –

+0

xml 예제는 xml 구조의 예제 일뿐입니다. 위에서 설명한대로 파일에 é 및 ä를 추가하면 xE9 및 xFC가 xml 파일에 저장됩니다.이것은 내 수업에 php 함수가있는 html 입력 필드에 의해 수행됩니다. – Zeebats

+0

실제 예제가 없으면 어떻게 도움을받을 것으로 예상합니까? –

답변

5

다음은 약간 거칠거나 자세한 내용입니다. 특히 이미 많은 노력을 기울여야합니다. 그냥 신선한 눈을 유지하고 일단 인코딩과 약간의 실수를하면, 그것은 종종 이미 망쳐 놨다 고 생각합니다. 따라서 여기서 어떤 메커니즘이 작동하는지 제대로 이해하는 것이 중요합니다.

나는 PHP의 DOMDocument에서 작동하는 몇 가지 메커니즘에 대해 설명하려고합니다. 이 흥미롭고 어려운 것을 알 수있을 것입니다. 그리고 결국에는 솔루션이 매우 간단하고 PHP 코드를 변경할 필요조차 없습니다.하지만 Stackoverflow와 관련하여 많이 설명되어 있지 않으므로 어쨌든이 문제를 해결하고 싶습니다. PHP 매뉴얼을 사용하고 있으며, 내가 이미 쓴 것처럼, 제대로 이해하는 것이 중요하기 때문에 더 많은 참고 자료가있는 것이 좋다.

기본적으로 XML은 UTF-8입니다. UTF-8은 요즘 인터넷을위한 완벽한 선택입니다. 물론 이것은 모든 경우에 완전히 사실이 아니지만 일반적으로 안전한 내기입니다. 따라서 XML은 자체적으로 기본 인코딩 인 UTF-8로 매우 훌륭합니다.

DOMDocument는 무엇을 의미합니까? DOMDocument는 기본적으로이 인코딩을 사용하므로 걱정할 필요가 없습니다. 여기에 간단한 표시이고, 출력은 주석 다음과

$doc = new DOMDocument(); 
$doc->save('php://output'); 
# <?xml version="1.0"?> 

이 매우 짧은 예에서는 기본 UTF-8 인코딩 PHP가 DOMDocument를 위해 보유 나타낸다. 이 문서는 여전히 루트 노드를 포함하지 않아도 XML 선언에 중 하나를 지정하지 않아 기본 XML UTF-8 인코딩 을 표시합니다. <?xml version="1.0"?>.

"그렇지만 나는 할 수 있습니다."라고 말할 수도 있습니다. 우리가 (버전) 제 1 및 제 2로 무엇을 사용,이 같이

$doc = new DOMDocument('1.0', 'UTF-8'); 
           ##### Encoding Parameter 
$doc->save('php://output'); 
# <?xml version="1.0" encoding="UTF-8"?> 

(인코딩이) 매개 변수를 기록 할 :이있는 DOMDocument의 인코딩 매개 변수는 생성자 호출 할 때입니다 것입니다 아웃. 그래서 네, 우리는 허용되지 않는 일을 할 수 있습니다. 그러나 이것에 허용되는 것은 무엇입니까 XML Declaration? 하나의 XML 버전 AFAIK가 있으며 1.0입니다. 따라서 version 매개 변수는 항상 1.0이어야합니다.인코딩에 허용되는 것은 무엇입니까? UTF-8, UTF-16, ISO-10646-UCS-2, ISO-10646-UCS-4, ISO-8859-UCS-2 등의 XML 스펙은 all the IANA characters sets이라고합니다. 1 ~ ISO-8859-9, ISO-2022-JP, Shift_JIS, EUC-JP. 좋습니다. 와우, 이미 긴 목록입니다.

그래서 PHP의 DOMDocument를 실질적으로 우리가 할 수 무엇을 살펴 수 있습니다 :

$doc = new DOMDocument('♥♥ love, hugs and kisses ♥♥', 'UTF-8'); 
$doc->save('php://output'); 
# <?xml version="♥♥ love, hugs and kisses ♥♥" encoding="UTF-8"?> 

인코딩이 예상대로 버전이 화장품입니다 작동하지만 보여줍니다이 UTF-8로 인코딩 된 유니 코드 문자를 사용하고 있습니다. 이제 뭔가 다른 인코딩을 변경할 수 있습니다 :

$doc = new DOMDocument('♥♥ love, hugs and kisses ♥♥', 'ISO-8859-1'); 
$doc->save('php://output'); 
# <?xml version="&#9829;&#9829; love, hugs and kisses &#9829;&#9829;" encoding="ISO-8859-1"?> 

을 유니 코드 마음 ISO-8859-1의 한 자리를 가지고 있지 않기 때문에, 그들은 그들의 따라 숫자 HTML 엔티티 (&#9829;)로 대체됩니다. ö (이진 문자열 PHP "\xF6")과 같은 ISO-8859-1 문자를 직접 추가하면 어떻게됩니까?

$doc = new DOMDocument("♥♥ l\xF6ve, hugs and kisses ♥♥", 'ISO-8859-1'); 
$doc->save('php://output'); 
# Warning: DOMDocument::save(): output conversion failed due to conv error, 
#   bytes 0xF6 0x76 0x65 0x2C 
#    ^^^^ | | | 
#    "ö" v e space 

이것은 작동하지 않습니다. DOMDocument는 우리가 제공 한 정보가 ISO-8859-1 출력으로 바뀔 수 없다고 알려줍니다. 이것은 예상됩니다 : DOMDocument는 UTF-8로 주어진 모든 입력을 기대합니다. 그래서 유니 코드에서이 시간을 ö을 할 수 있습니다 :

$doc = new DOMDocument('♥♥ löve, hugs and kisses ♥♥', 'ISO-8859-1'); 
$doc->save('php://output'); 
# <?xml version="&#9829;&#9829; l�ve, hugs and kisses &#9829;&#9829;" encoding="ISO-8859-1"?> 

이 다이아몬드에서이 물음표에도 불구하고 지금 잘 보인다. 내 컴퓨터에서 디스플레이/출력이 UTF-8이기 때문에 여기에 ISO-8859-1 ö 문자를 표시 할 수 없습니다. 그래서 내 디스플레이가 � Unicode Character 'REPLACEMENT CHARACTER' (U+FFFD)으로 바꿉니다. 어느 것이 맞습니까? "ö"가 이제 작동합니다.

여기까지는 UTF-8로 인코딩 된 문자열을 DOMDocument로 전달할 수 있으며 이는 해당 문서에 지정한 XML 인코딩과 관계가 없음을 분명히합니다.

그래서 UTF-8 문서로이 규칙을 깨고 UTF-8 이외의 텍스트 (예 : ISO-8859-1 resp)를 추가합시다. Windows-1252 :

$doc = new DOMDocument('1.0', 'UTF-8'); 

$doc->appendChild($doc->createElement('root')) 
    ->appendChild($doc->createElement('question')) 
    ->appendChild($doc->createTextNode("l\xF6ve, hugs and kisses")); 

$doc->save('php://output'); 
# <?xml version="1.0" encoding="UTF-8"?> 
# <root><question>l�ve, hugs and kisses</question></root> 

출력을 보는 프로그램에 따라 물음표 not가 아닌 "xF6"만 표시 될 수 있습니다. 나는 그것이 당신의 파일 편집기의 경우라고 말할 것입니다.

그래서 이것은 또한 솔루션입니다 :

->appendChild($doc->createTextNode(utf8_encode("l\xF6ve, hugs and kisses"))); 
            ########### (works with ISO-8859-1 only (!)) 

# <?xml version="1.0" encoding="UTF-8"?> 
# <root><question>löve, hugs and kisses</question></root> 

또는 귀하의 경우

, 당신의 웹 사이트가 UTF-을 기대 브라우저를 말해 : 당신이있는 DOMDocument로 문자열 데이터를 전달할 때, UTF-8 인코딩인지 확인 8. 그런 다음 브라우저가 이미 올바른 인코딩으로 데이터를 전송했기 때문에 다시 인코딩 할 필요가 없습니다.

+0

그래, 그 트릭을 했어. 내 HTML 헤더에 메타 태그 삽입. 내가 PHP를 시도 utf - 8_encode 및 디코딩하지만 그건 다른 문자 äà © 같은 반환했습니다. 고맙습니다. 이제 내 웹 앱은 점심을 먹을 준비가되었습니다. – Zeebats

+0

아주 좋습니다! 그것이 제가 생각한 것입니다.하지만 DOMDocument 인코딩 매개 변수가 작동하는 방식을 보여 주므로 인코딩을 지정할 위치를 더 잘 찾을 수 있습니다 (또는 인코딩을 다시 인코딩 할 위치). 무슨 에디터를 xXX 디스플레이에 사용하셨습니까? 그 메모장은 아마도 + +? – hakre

+0

예전 메모장 ++를 사용합니다. 더 나은 편집자를 알고 있습니까? – Zeebats