PHP 生成 XML,Flash (ActionScript) 讀取顯示亂碼。瀏覽器直接開 XML 正常,但 Flash 載入即錯誤。
| 層級 | 關鍵點 | 常見錯誤 |
|---|---|---|
| PHP 腳本編碼 | 檔案儲存為 UTF-8 無 BOM | ANSI/Big5 編碼檔案 |
| XML 宣告編碼 | <?xml version="1.0" encoding="UTF-8"?> | 宣告 UTF-8 但實際內容非 UTF-8 |
| XML 實際內容編碼 | 必須與宣告一致 | PHP 字串連接導致編碼不一 |
| HTTP 回應 Header | Content-Type: application/xml; charset=UTF-8 | 未設定或設定錯誤 |
| Flash 讀取設定 | System.useCodePage = true (非 UTF-8 時) | UTF-8 卻設為 true、或非 UTF-8 未設 |
<?php
// 1. PHP 檔案儲存為 UTF-8 無 BOM (編輯器設定)
// 2. 設定 HTTP Header
header('Content-Type: application/xml; charset=UTF-8');
// 3. DOMDocument 生成 (自動處理編碼)
$dom = new DOMDocument('1.0', 'UTF-8');
$dom->formatOutput = true;
$root = $dom->createElement('data');
$dom->appendChild($root);
$item = $dom->createElement('item', '中文內容測試 😀');
$root->appendChild($item);
// 4. 輸出 (saveXML 自動按 UTF-8 編碼)
echo $dom->saveXML();
Flash 端:System.useCodePage = false; (預設即為 false,UTF-8 模式)
<?php
// PHP 檔案為 Big5 編碼
header('Content-Type: application/xml; charset=UTF-8');
$dom = new DOMDocument('1.0', 'UTF-8');
$root = $dom->createElement('data');
$dom->appendChild($root);
// 字串需轉碼後才能加入 DOM
$text = iconv('Big5', 'UTF-8', '中文內容'); // 轉碼
$item = $dom->createElement('item', $text);
$root->appendChild($item);
echo $dom->saveXML();
關鍵:DOMDocument 建構子指定 UTF-8 只影響輸出宣告與內部處理,輸入字串必須已是 UTF-8。
<?php
// 強制輸出 Big5
header('Content-Type: application/xml; charset=Big5');
$dom = new DOMDocument('1.0', 'Big5'); // 宣告 Big5
$dom->formatOutput = true;
$root = $dom->createElement('data');
$dom->appendChild($root);
// 輸入字串必須為 Big5 編碼
$text = '中文內容'; // PHP 檔案即為 Big5 編碼
$item = $dom->createElement('item', $text);
$root->appendChild($item);
echo $dom->saveXML();
Flash 端:System.useCodePage = true; (告訴 Flash 使用系統預設代碼頁,中文系統為 CP950/Big5)
注意:DOMDocument 對 Big5/GB2312 支援有限,可能報錯 output conversion failed。建議改用字串拼接或 iconv 轉碼後輸出。
<?php
// 產生 XML 後處理:替換宣告編碼
$xml = $dom->saveXML(); // 實際內容為 Big5 (因 PHP 檔案為 Big5)
// 將宣告的 UTF-8 改為 Big5
$xml = preg_replace('/encoding\s*=\s*["\']UTF-8["\']/i', 'encoding="Big5"', $xml, 1);
header('Content-Type: application/xml; charset=Big5');
echo $xml;
這是「治標不治本」的緊急修復,長期應遷移至場景 1。
import flash.net.URLLoader;
import flash.net.URLRequest;
import flash.system.System;
import flash.events.Event;
import flash.events.IOErrorEvent;
System.useCodePage = false; // UTF-8 模式 (預設)
var loader:URLLoader = new URLLoader();
loader.addEventListener(Event.COMPLETE, onXmlLoad);
loader.addEventListener(IOErrorEvent.IO_ERROR, onError);
loader.load(new URLRequest("data.xml"));
function onXmlLoad(e:Event):void {
var xml:XML = new XML(e.target.data);
xml.ignoreWhitespace = true;
trace(xml.toXMLString()); // 正常顯示中文
}
function onError(e:IOErrorEvent):void {
trace("載入失敗: " + e.text);
}
Content-Type: application/xml; charset=UTF-8<?xml version="1.0" encoding="UTF-8"?>System.useCodePage 設定是否與 XML 實際編碼匹配Flash 已停止支援 (2020/12/31)。新專案請採用:
fetch() / axios + 原生 DOM 操作