【问题标题】:Convert special characters to ISO Latin-1 codes with php?使用 php 将特殊字符转换为 ISO Latin-1 代码?
【发布时间】:2011-06-14 21:12:57
【问题描述】:

跟进我之前创建的post

我发现 XML 在处理特殊字符时实际上采用数字代码而不是名称代码。所以我在网上浏览了如何将特殊字符转换为数字代码,但我没有任何运气。

我是否必须编写一个函数来完成这项任务,或者 php 是否带有任何可以节省大量工作的默认函数?

例如,我想将á 转换为á á 转换为á

有可能吗?

如果您有任何想法,请提供帮助。

编辑:

我正在使用此建议将特殊字符转换为数字字符,

$txt = preg_replace('/([\x80-\xff])/e', "'&#' . ord('$1') . ';'", $txt);

但我刚刚发现它不会将这 5 个特殊字符转换为数字代码 - <>&'"

我怎样才能绕过它们?

谢谢。

【问题讨论】:

    标签: php xml special-characters


    【解决方案1】:

    使用mb_encode_numericentity。示例(假设脚本以 UTF-8 编码):

    <?php
    header("Content-type: text/plain");
    echo mb_encode_numericentity("aáb",
        array(0x0080, 0x10FFFF, 0x0, 0xFFFFFF), "UTF-8");
    

    会给:

    a&#225;b
    

    此示例将所有非 ASCII 字符编码为其数字实体。如果您还想对在 XML 中具有特殊含义的字符 &lt;&gt;&amp;'" 进行编码,请使用 htmlspecialchars(或使用 mb_encode_numericentity,但添加这些字符到第二个参数中的数组)。

    但是请注意,如果您的 XML 文件以 UTF-8 编码,您只需编码几个字符(á 不是其中之一)。请参阅 here 以获取在 mb_encode_numericentity 中使用的适当转换映射(这包括 XML 特殊字符 &lt;&gt;&amp;'" 的转换,并且还对以下字符进行编码禁止在 XML 文档中按字面意思出现,如 U+0000)。

    【讨论】:

    • 你有完整的地图吗?
    • @cyberwiki 你在说什么?有什么用?这会将非 ASCII 格式的 LATIN-1 字符转换为其数字实体。作为奖励,它还可以转换所有其他更高的 unicode 字符。如果他想逃跑&lt;&gt;&amp;'",他可以使用htmlspecialchars
    • 很好地识别识别非ASCII字符的数组值,非常有帮助。
    【解决方案2】:

    这里提供了一个简洁的功能http://www.sourcerally.net/Scripts/39-Convert-HTML-Entities-to-XML-Entities。您将 html_entities 链接到提供的函数以获取 text->html->xml

    不,到目前为止,php 还没有像 xml_entities 这样的内置函数

    【讨论】:

    • 您链接的页面信息不正确。它开始“输入带有 & 之类的 html 实体的字符串并取回正确的 xml 实体 - 在本例中为  ”。这是误导。 &amp;amp; 是所有 XML 文档中的有效实体,还有 &amp;lt;&amp;gt;&amp;quot;&amp;apos;
    • 顺便说一句,如果你想解码用于 XML 文档的 html 实体,你可以使用html_entity_decode
    • @artefacto - 我们很高兴。这是一个起点。您始终可以链接 html_entities 以获取 html 以进一步转换为 xml。 html 实体是 xml 所需内容的一个很好的列表。
    • @artefacto if you wanted to decode html entities for use in a XML document 正好相反,请点击问题链接到 OP 的其他问题。
    • 您链接到的页面包含错误信息,您会期待什么?现在你用另一个愚蠢的东西进行编辑,比如“你将 html_entities 链接到提供的函数以获取 text->html->xml”,这在语法上甚至都不正确......对不起,downvote 是应得的。
    【解决方案3】:

    通用的方法是使用:

    $txt = preg_replace('/([\x80-\xff])/e', "'&#' . ord('$1') . ';'", $txt);
    

    您必须确保 $txt 确实已经包含 Latin-1 (utf8_decode),否则您会从字符串字节中收到错误的值。

    【讨论】:

    • 看到他原来的问题,XML文档是UTF-8,不是Latin-1(没有指定编码,所以默认是UTF-8)。
    • @Artefacto:哦,我明白了。我在这里盲目地看标题,并希望 Latin-1 和 Unicode 枚举无论如何都是相同的。好吧,他必须尝试什么有效..
    • @mario:谢谢。它似乎工作正常 - echo preg_replace('/([\x80-\xff])/e', "'' . ord('$1') . ';'", "ö");我得到 ö这就是我所追求的。谢谢!
    • @mario:刚刚发现您建议的代码不会将这些字符转换为数字代码 - 、&、' 和“。我该如何绕过它们?
    • @lauthiamkok:如果您也希望它们转换,请将它们包含在正则表达式中的方括号 [&lt;\'"&amp;&gt;\x80-\xff]
    猜你喜欢
    • 2015-04-11
    • 2010-10-12
    • 2019-12-09
    • 2011-04-22
    • 1970-01-01
    • 1970-01-01
    • 2015-03-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多