首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP 生成 XML 給 Flash 讀取亂碼終極解決:編碼一致性全鏈路指南

     編輯:PHP 相關知識

問題現象

PHP 生成 XML,Flash (ActionScript) 讀取顯示亂碼。瀏覽器直接開 XML 正常,但 Flash 載入即錯誤。

根因分析:三方編碼必須一致

層級關鍵點常見錯誤
PHP 腳本編碼檔案儲存為 UTF-8 無 BOMANSI/Big5 編碼檔案
XML 宣告編碼<?xml version="1.0" encoding="UTF-8"?>宣告 UTF-8 但實際內容非 UTF-8
XML 實際內容編碼必須與宣告一致PHP 字串連接導致編碼不一
HTTP 回應 HeaderContent-Type: application/xml; charset=UTF-8未設定或設定錯誤
Flash 讀取設定System.useCodePage = true (非 UTF-8 時)UTF-8 卻設為 true、或非 UTF-8 未設

四大典型場景解決方案

場景 1:全鏈路 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 模式)

場景 2:PHP 檔案非 UTF-8 (ANSI/Big5),需輸出 UTF-8 XML

<?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。

場景 3:歷史系統必須輸出 Big5/GB2312 XML

<?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 轉碼後輸出。

場景 4:修正「宣告 UTF-8 實際非 UTF-8」的歷史資料

<?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。

Flash 端完整設定 (AS3)

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);
}

除錯檢查清單

  1. 瀏覽器直接開 XML URL,檢查原始碼編碼、中文是否正常
  2. 確認 HTTP Header: Content-Type: application/xml; charset=UTF-8
  3. 確認 XML 宣告: <?xml version="1.0" encoding="UTF-8"?>
  4. Flash 端 System.useCodePage 設定是否與 XML 實際編碼匹配
  5. PHP 檔案編碼、資料庫連線編碼、字串來源編碼全鏈路一致

現代替代方案

Flash 已停止支援 (2020/12/31)。新專案請採用:

  • JSON + JavaScript:fetch() / axios + 原生 DOM 操作
  • WebSocket:即時雙向通訊
  • HTML5 Audio/Video/Canvas:多媒體播放
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved