【问题标题】:iso-8895-1 to xml acceptable UTF-8iso-8895-1 到 xml 可接受的 UTF-8
【发布时间】:2010-10-21 18:29:54
【问题描述】:

我正在将网页中的文本/html 解析为 xml 提要,文本/html 编码为 iso-8895-1,而 XML 提要必须为 UTF-8。我使用了 html 实体,但不得不手动替换大量字符,这是我目前所拥有的(仍然没有解析所有文本)

$desc = str_replace(array("\n", "\r", "\r\n"),"",$desc);
    $desc = str_replace(array("’","‘","”","“"),"'",$desc);
  $desc = str_replace("£","£",$desc);
    $desc = str_replace("é","é",$desc);
    $desc = str_replace("²","2",$desc);
    $desc = str_replace(array("-","•"),"‐",$desc);
$desc = htmlentities($desc, ENT_QUOTES, "UTF-8");

【问题讨论】:

  • 看起来您正在通过将字符串粘合在一起来构建 XML。不要那样做。使用 XML 库,您可以告诉它您的输出编码,它会满足您的任何编码需求。 (htmlentities 不会这样做,因为除了少数之外,所有这些都未定义用于任意 XML)
  • 实际上我正在使用 $xml = new DOMDocument('1.0', 'UTF-8'); 构建我的 xml并遍历附加子节点和文本节点的数组。这只是为其中一个节点准备文本。

标签: php xml utf-8


【解决方案1】:

使用iconv()。它还允许您在 UTF-8 中使用本机字符 - 无需 HTML 实体。

$data = iconv("ISO-8859-1", "UTF-8", $text);

在将从 UTF-8 编码到另一个字符集时,使用 IGNORE 或 TRANSLIT 删除或音译不可翻译的字符。

另外,@Gumbo 显示的 mb_* 函数也可以工作。

【讨论】:

  • +1,可能添加//TRANSLIT 以防止无法在 ISO-8859-1 中表示的字符破坏字符串。
  • 嗯,ISO 8859-1的字符集是Unicode字符集的一个子集。所以没有必要忽略或音译任何东西,因为没有区别:charset(ISO 8859-1) \ charset(Unicode) = ∅.
  • 不要忘记修改任何给出字符集的META标签,因为之后它可能会不准确。
  • @Ignacio Vazquez-Abrams:XML 提要可能没有META 元素——至少我所知道的没有。
【解决方案2】:

您也可以使用utf8_encodemb_convert_encoding

$desc = utf8_encode($desc);
// OR
$desc = mb_convert_encoding($dest, 'UTF-8', 'ISO-8859-1');

两者都会将编码从 ISO 8859-1 转换为 UTF-8。

【讨论】:

    猜你喜欢
    • 2010-11-18
    • 1970-01-01
    • 1970-01-01
    • 2015-06-20
    • 1970-01-01
    • 1970-01-01
    • 2016-10-04
    • 2011-09-23
    • 2016-07-18
    相关资源
    最近更新 更多