【问题标题】:MediaWiki API section names encodingMediaWiki API 部分名称编码
【发布时间】:2013-02-28 05:57:52
【问题描述】:

对于 [[Test#?]],我从 MediaWiki API 的action=parse 位获得“Test#.3F”。这种编码是什么?如何使用Perl's CPAN 将其转换为人类可读的格式?

URI::Encode 适用于百分比解码,但不适用于部分名称。

【问题讨论】:

  • 我不熟悉 API,但 ? 在 ASCII 中是 0x3F,在 Unicode 中是 U+003F。 Perl 的ord 函数返回字符串中第一个字符的代码点,而chr 函数则相反。 IE。像s/\.[A-F0-9]{2}/chr $1/eg 这样的东西会处理一些情况。

标签: perl encoding character-encoding mediawiki url-encoding


【解决方案1】:

它是 UTF-8 百分比编码,但使用 . 而不是 %,并且空格替换为下划线;此外,多个连续的空格被折叠,: 被保留(未编码为.3A)。

处理它的确切代码是Parser::guessSectionNameFromWikiText(),但如果您不想挖掘大量代码,请检查旧 MediaWiki 版本中更简单的实现(除了少数边缘情况外兼容),@ 987654322@:

str_replace( '%', '.', str_replace('+', '_', urlencode( $text ) ) );

【讨论】:

  • 用 Perl 术语编写,这将是:$str = uri_encode($text); $str =~ tr/%+/._/; $str,相反的是 $str =~ tr/._/%+/; uri_decode($str)
  • 你知道边缘情况是什么吗?
  • @svick:章节标题中的 wiki 或 HTML 标记。其实wikilinks和section headers的解析略有不同:如果只是想模拟[[#...]],只需要解码HTML实体,但如果想匹配== ... ==生成的anchor,则需要做一些更特殊的处理。 (另外,我用我发现的一些不那么边缘的情况扩展了答案。)
  • @Gryllida,根据HTML 4.01,id 中允许的字符是字母数字、.:-_,因此他们必须将 % 替换为其中一个.
  • FWIW 在 MediaWiki 文档中这称为锚编码。很少有其他软件会费心提供从外部站点到结构可能发生根本变化的内容的稳定部分链接,因此编码锚点的问题不会经常出现。 HTML5 几乎允许 ID 中的任何内容,因此 MediaWiki 最终可能会迁移到更简单的编码方法。
猜你喜欢
  • 1970-01-01
  • 2014-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-18
  • 2018-06-25
  • 2012-12-11
相关资源
最近更新 更多