【问题标题】:Hex-encode ISO-8859-1 characters (outside of ASCII) in string?十六进制编码字符串中的 ISO-8859-1 字符(ASCII 之外)?
【发布时间】:2012-04-25 00:24:55
【问题描述】:

例如。输入:

Riferimento-a-‚¬-9-90

输出:

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

请帮忙,在此先感谢。

【问题讨论】:

  • 你的问题是什么?帮忙做什么?输入还是输出?解释这里发生了什么?如果使用安全吗?请添加您的代码。输入字符串看起来不像 ISO-8859-1。

标签: php string hex iso-8859-1


【解决方案1】:

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

$encoded = rawurlencode($str);

但是,您粘贴到问题中的字符串不是 ISO-8859-1 编码的,如果它包含 BPH(此处允许中断)控制字符,该字符是不可打印的字符。与三元组/十六进制编码字符串一样,以下 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 编码。

这可能是您正在寻找的。​​p>

松散相关:How to substitute non SGML characters in String using PHP?


您在 cmets 中另外询问:

如何将è 转换为%hex

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

您首先将命名的 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 集控制代码。所以我假设它是Windows-1252,即common in HTML documents

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

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

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

【讨论】:

  • 非常感谢。如果我使用 rawurlencode 转换“Riferimento-a-ℓ-9-90”,我得到“Riferimento-a-%C3%A2%E2%80%9A%C2%AC-9-90”,而不是“Riferimento -a-%E2%82%AC-9-90",这是我想要的,你能告诉我如何获得正确的字符吗?我是亚洲人,不熟悉欧洲字符处理,对不起我的无知。
  • 以及如何转换 è到 %hex 模式?是他们的任何内置函数都可以做到这一点,还是我必须构建一个映射数组来将它们全部转换
  • 这个字符串来自 mysql 数据库,使用 phpmyadmin,它显示为“Riferimento-a-€-9-90”,我想将其转换为“Riferimento-a-%E2%82 %AC-9-90"。
猜你喜欢
  • 2019-11-23
  • 2018-08-12
  • 1970-01-01
  • 2010-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-26
  • 2012-03-27
相关资源
最近更新 更多