2

例如。输入:

Riferimento-a-‚¬-9-90

输出:

Riferimento-a-%E2%82%AC-9-90

请帮助,在此先感谢。

4

1 回答 1

3

要将 ISO-8859-1 字符串转换为三元组/百分比编码,请使用rawurlencode

$encoded = rawurlencode($str);

但是,您粘贴到问题中的字符串不是 ISO-8859-1 编码的,如果它包含BPH(Break Permitted Here) 控制字符,它是一个不可打印的字符。与三元组/十六进制编码字符串一样,以下 PHP 表示法也是二进制安全的:

$str = "Riferimento-a-\xE2\x82\xAC-9-90";

将其作为 UTF-8 编码的字符串,结果如下:

Riferimento-a-€-9-90

%E2%82%AC是 EURO SIGN (U+20AC) 的 urlencoded UTF-8 编码。

这可能是您正在寻找的。

松散相关:如何使用 PHP 替换字符串中的非 SGML 字符?


您在评论中还问:

如何转换è%hex

由于没有è( è) 涉及,我想你并不是很清楚你在这里问什么。但我先从你问的开始,因为它最简单。这是一个两步过程:

渲染?grid=%2B--------%2B+++%2B--------%2B---------%2B+++%2B-----%2B-- ----%2B+++%2B---%2B----%2B%0D%0A%7C+cFDA+++%7C+++%7C+解码+++++++++++%7C+++%7C+编码+++++%7C+++%7C+cFDA+++%7C%0D% 0A%7C+实体+%2B--%3E%2B------%2B--%3E%2B---------- -%2B--%3E%2B+实体+%7C%0D%0A%7C+%26Name%3B+%7C+++%7Chtml_entity_decode%7C+++%7Crawurlencode%7C+++%7C+%25HEX+++%7C%0D%0A%7C++++%7Bd%7D% 7C+++%7C++cDBF++++++++++++%7C+++%7C++c1AB++++++%7C+++%7C+++++%7Bd%7D%7C%0D%0A%2B--------%2B+++%2B--------% 2B---------%2B+++%2B-----%2B------%2B+++%2B--------%2B&scale=1&background=FFFFFF&E=on&timeout=10

您首先将命名的 HTML 实体转换为目标字符编码中的标准字符:

$entity = 'è';
$iso_8859_1 = html_entity_decode($entity, NULL, 'ISO-8859-1');

然后将其转换为 '%hex' 编码,通常称为 urlencoding:

$hex = rawurlencode($iso_8859_1);

基本上就是这样。如果您尝试转换目标编码中不存在的实体,则它不会被转换,因此无论字符编码如何都会保留信息。

但是,我认为这只是为您提供信息,因为除了运行这些转换之外,您还有其他一些问题。

在 phpmyadmin 中,它显示为"Riferimento-a-€-9-90",我想将其转换为"Riferimento-a-%E2%82%AC-9-90"

您还没有分享显示的内容实际上是如何以文本表示的,但是因为您询问了命名的 HTML 实体(例如è),所以我假设您€ / %E2%82%A特别关注该部分:

â    %E2    Windows-1252    LATIN SMALL LETTER A WITH CIRCUMFLEX (U+00E2)
‚    %82    Windows-1252    SINGLE LOW-9 QUOTATION MARK (U+201A)
¬    %AC    Windows-1252    NOT SIGN (U+00AC)

您为这些字符提供的有关 ISO-8859-1 的信息是错误的,因为在 ISO-8859-1‚ / %82中不存在,在那个地方是一些 C1 集控制代码。所以我假设它在 HTML 文档Windows-1252中很常见。

正如您所写,您从数据库中接收数据,我假设 phpmyadmin 将您在数据库中的 UTF-8 文本显示为 Windows-1252:

MySQL      : UTF-8:         \xE2\x82\xAC (€)    
PHPMyAdmin : Windows-1252:  \xE2\x82\xAC (€)

如果您现在从数据库中获取 UTF-8 编码的数据,则只需在其上运行rawurlencode即可获得您要求的十六进制编码。

于 2012-04-12T16:01:10.870 回答